现在 EditorFor 将如何识别要包含的模板 1 或模板 2?谢谢。
如果模板属性是IEnumerable<Template>,那么它将包括Template.cshtml。
所以这是一般规则:
如果您在 EditorFor 调用中使用的属性不是集合 (IEnumerable<T>),则 ASP.NET MVC 将查找与属性类型同名的模板。例如:
public MyViewModel FooBar { get; set; }
将寻找MyViewModel.cshtml。您可以使用 UIHint 属性覆盖此行为。因此:
[UIHint("Baz")]
public MyViewModel FooBar { get; set; }
将寻找Baz.cshtml。
如果属性是一个集合 (IEnumerable<T>),那么 ASP.NET MVC 将寻找一个与集合元素类型同名的编辑器模板。
因此:
public IEnumerable<MyViewModel> Foos { get; set; }
将使用MyViewModel.cshtml,它将为集合的每个元素自动呈现。
另一方面,如果您使用UIHint:
[UIHint("Bar")]
public IEnumerable<MyViewModel> Foos { get; set; }
然后Bar.cshtml 将被渲染,但有一个问题:它不会为集合的每个元素渲染,但它会直接作为模型传递给集合,你必须在里面循环。这是设计使然。
就模板的位置而言,ASP.NET MVC 将首先在名为 EditorTemplates 的子文件夹中查找当前控制器,然后在 ~/Views/Shared/EditorTemplates 中查找。这允许您覆盖当前控制器的一些全局模板。
或者,您可以在使用 EditorFor 帮助器时指定要呈现的模板的名称:
@Html.EditorFor(x => x.MyProperty, "Bar")
将使用Bar.cshtml。与UIHint 相同的规则适用于集合。