0

我想将嵌套字典传递给 EditorFor viewData。

@{
    var viewData = new RouteValueDictionary();
    var htmlAttributes = new RouteValueDictionary();
    htmlAttributes.Add("title", "foo");
    viewData["htmlAttributes"] = htmlAttributes;
}
Html.EditorFor(model => model.SomeProperty, viewData);

问题是 tile="foo" 没有被渲染。当我使用

var htmlAttributes = new {title = "foo"};

一切都按预期工作。

我需要 htmlAttributes 成为字典,因为在我的应用程序中它是动态生成的。

那么我怎样才能在其中传递字典。我已经尝试将 thmlAttributes 作为 ExpandoObject 传递,但这也不起作用。

4

2 回答 2

0

恐怕这是不可能的,至少不是简单的方法,因为 EditorFor 创建了许多 html 元素,因此不清楚 htmlAttributes 应该应用哪个元素。

但是,困难的方法是在 Views/Shared/EditorTemplates/Object.cshtml 中实现自己的 Object.cshtml。以下是自定义 Object.cshtml(特定于引导程序)的示例,您可以在其中从 ViewData 中获取值并以您喜欢的方式构造输出 Html。

@using MvcApplication1.Utility
@if (ViewData.TemplateInfo.TemplateDepth > 1) {
    @ViewData.ModelMetadata.SimpleDisplayText
} else {
    foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) {
        var htmlString = prop.IsReadOnly ? Html.Display(prop.PropertyName) : Html.Editor(prop.PropertyName);
        if (prop.HideSurroundingHtml) {
            @htmlString
        }
        else
        {
            var errors = Html.ValidationErrors(prop);
            <div class="form-group @(prop.IsReadOnly ? "form-group-readonly" : "") @(errors.Any() ? "has-error has-feedback" : "")">
                <label class="control-label" for="@ViewData.TemplateInfo.GetFullHtmlFieldId(prop.PropertyName)">@prop.GetDisplayName()</label>
                @htmlString
                @foreach (var err in errors)
                {
                    <div class="field-validation-error">@err.ErrorMessage</div>
                }
            </div>
        }
    }
}

和效用函数

    public static IEnumerable<ModelError> ValidationErrors<TModel>(this HtmlHelper<TModel> htmlHelper, ModelMetadata modelMetadata)
    {
        string modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(modelMetadata.PropertyName);
        return ValidationErrors(htmlHelper, modelName);
    }

    public static IEnumerable<ModelError> ValidationErrors<TModel>(this HtmlHelper<TModel> htmlHelper)
    {
        return ValidationErrors(htmlHelper, String.Empty);
    }

    private static IEnumerable<ModelError> ValidationErrors(this HtmlHelper htmlHelper, String modelName)
    {
        FormContext formContext = htmlHelper.ViewContext.FormContext;
        if (formContext == null)
            yield break;

        if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName))
            yield break;

        ModelState modelState = htmlHelper.ViewData.ModelState[modelName];
        if (modelState == null)
            yield break;

        ModelErrorCollection modelErrors = modelState.Errors;
        if (modelErrors == null)
            yield break;

        foreach(var err in modelErrors)
            yield return err;
    }
于 2014-12-09T14:21:48.003 回答
0

目前不可能(MVC 5.2)看到这个错误: https ://aspnetwebstack.codeplex.com/workitem/1736

于 2014-12-15T13:04:20.320 回答