ASP MVC 5.2在EditorFor中为htmlAttributes使用嵌套字典

时间:2014-12-09 13:51:48

标签: c# asp.net asp.net-mvc editorfor asp.net-mvc-5.2

我想将嵌套的Dictionary传递给EditorFor viewData。

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

问题是瓷砖=" foo"不会被渲染。 当我使用

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

一切都按预期工作。

我需要将htmlAttributes作为一个词典,因为在我的应用程序中它是动态生成的。

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

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

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