@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
if (!string.IsNullOrEmpty(property.TemplateHint))
{
@Html.Editor(property.PropertyName, property.TemplateHint)
}
else
{
@Html.Editor(property.PropertyName)
}
}
但请注意,如果您不依赖已建立的约定来解析复杂集合类型(又名)的模板,并且在您的集合属性上~/Views/Shared/EditorTemplates/NameOfTheTypeOfCollectionElements.cshtml
使用了 an :UIHint
[UIHint("FooBar")]
public IEnumerable<FooViewModel> Foos { get; set; }
那么~/Views/Shared/EditorTemplates/FooBar.cshtml
编辑器模板必须是强类型的,IEnumerable<FooViewModel>
而不是FooViewModel
. 所以要小心,如果这是你的情况,如果你想访问集合的各个项目,你可以在这个自定义模板中循环。它将不再是 ASP.NET MVC,它会自动为您循环并为每个元素调用编辑器模板。
更新:
仍然无法重现您的问题。
自定义属性:
public class ACustomAttribute : Attribute, IMetadataAware
{
private readonly string _templateHint;
public ACustomAttribute(string templateHint)
{
_templateHint = templateHint;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["foo"] = "bar";
metadata.TemplateHint = _templateHint;
}
}
模型:
public class MyViewModel
{
[ACustom("Something")]
public IEnumerable<int> Foos { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Foos = Enumerable.Range(1, 5)
};
return View(model);
}
}
查看 ( ~/Views/Home/Index.cshtml
):
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorForModel()
}
对象类型 ( ~/Views/Shared/EditorTemplates/Object.cshtml
) 的编辑器模板:
@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
if (!string.IsNullOrEmpty(property.TemplateHint))
{
@Html.Editor(property.PropertyName, property.TemplateHint)
}
else
{
@Html.Editor(property.PropertyName)
}
}
自定义编辑器模板 ( ~/Views/Shared/EditorTemplates/Something.cshtml
):
@model IEnumerable<int>
<h3>
@ViewData.ModelMetadata.AdditionalValues["foo"]
</h3>
@foreach (var item in Model)
{
<div>
@item
</div>
}
结果:
如您所见,我们添加的其他元数据显示在模板中。