EditorFor()可以采用object additionalViewData参数,典型的填充方法如下:

EditorFor(model => model.PropertyName, new { myKey = "myValue" })

如何在自定义HTML帮助器中检查AdditionalViewData的内容,添加或添加键的现有值等?

我尝试了以下方法:


转换为Dictionary<string, object>()并添加/附加值:不起作用,因为它看起来像在MVC中使用EditorFor的实现使用新的RouteValueDictionary(additionalViewData)将字典嵌入字典中
使用new RouteValueDictionary(additionalViewData)转换为RouteValueDictionary,但存在与上述相同(或非常相似)的问题


我也乐于接受“您做错了” –也许我错过了一种更简单的方法。请记住,我想做的是编写一个可重用的HTML帮助器,并将一些值添加到自定义视图要使用的AdditionalViewData中。其中一些值取决于属性中的元数据,因此要使用一堆不同的模板并不容易。

更新我正在做的例子:

    public static MvcHtmlString myNullableBooleanFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> choice, string templateName, object additionalViewData)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(choice, htmlHelper.ViewData);

        /*
    here need to add to additionalViewData some key values among them:
    { propertyName, metadata.PropertyName }

     */

        StringBuilder sb = new StringBuilder();
        sb.AppendLine(htmlHelper.EditorFor(choice, templateName, additionalViewData).ToString());
        MvcHtmlString validation = htmlHelper.ValidationMessageFor(choice);
        if (validation != null)
            sb.AppendLine(validation.ToString());
        return new MvcHtmlString(sb.ToString());
    }


更新将匿名对象转换为Dictionary<string, object>()并将该字典传递给EditorFor()时发生的情况:

我在Razor视图中放置了一个断点并检查了ViewData。看来,传递给EditorFor()的字典被放在另一个Dictionary<string, object>()中。在“立即窗口”中,ViewData如下所示:

ViewData.Keys
Count = 4
    [0]: "Comparer"
    [1]: "Count"
    [2]: "Keys"
    [3]: "Values"


看看字典中如何包含字典的内容?是的,实际数据在该内部词典中,但是不足为奇的是,这是行不通的。

增加赏金。

最佳答案

如果我理解正确,那么您正在尝试遍历匿名类型的属性。如果是这样:How do I iterate over the properties of an anonymous object in C#?

[编辑]
好的,不仅如此。现在,这真的让我感到困扰,因为我爱C#,它不会让我做我也喜欢的Python。因此,这是一个解决方案,如果您使用的是C#4,但它很凌乱并且可以解决我遇到的类似问题,但可能并不完全适合您:

    // Assume you've created a class to hold commonly used additional view data
    // called MyAdditionalViewData. I would create an inheritance hierarchy to
    // contain situation-specific (area-specific, in my case) additionalViewData.
class MyAdditionalViewData
{
    public string Name { get; set; }

    public string Sound { get; set; }
}

/* In your views */
// Pass an instance of this class in the call to your HTML Helper
EditorFor(model => model.PropertyName,
    new { adv = new MyAdditionalViewData { Name = "Cow", Sound = "Moo" } }) ;

    /* In your HTML helper */
    // Here's the C# 4 part that makes this work.
dynamic bovine = new ExpandoObject();

// Copy values
var adv = x.adv;
if (adv.Name != null) bovine.Name = adv.Name;
if (adv.Sound != null) bovine.Sound = adv.Sound;

// Additional stuff
bovine.Food = "Grass";
bovine.Contents = "Burgers";

    // When the MVC framework converts this to a route value dictionary
    // you'll get a proper object, not a dictionary within a dictionary
var dict = new RouteValueDictionary(bovine);


必须有一个更好的方法。

关于asp.net-mvc - EditorFor()和AdditionalViewData:如何在助手类中添加数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6296583/

10-13 06:45