@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>
}
結果:
ご覧のとおり、追加した追加のメタデータがテンプレートに表示されています。