@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
) и использовали 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>
}
Результат:
![введите здесь описание изображения](https://i.stack.imgur.com/r2G0C.png)
Как видите, дополнительные метаданные, которые мы добавили, отображаются в шаблоне.
person
Darin Dimitrov
schedule
10.08.2012