我想将嵌套的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传递,但这也不起作用。
答案 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