我需要一些关于 mvc3 中的编辑器模板的帮助。我想知道视图如何知道要调用哪个编辑器模板EditorFor?是否在某处添加了任何类型的参考 ios?例如。- 我有 2 个名为的编辑器模板template1.cshtml,template2.cshtml并且我正在编写以下语句 -
@Html.EditorFor(model => model.template)
(模板是名为的模型列表Template)现在如何EditorFor识别template1要包含的内容或template2?谢谢。
1 回答
现在 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.cshtmlwhich 将自动为集合的每个元素呈现。
另一方面,如果您使用UIHint:
[UIHint("Bar")]
public IEnumerable<MyViewModel> Foos { get; set; }
thenBar.cshtml将被渲染,但有一个问题:它不会为集合的每个元素渲染,但它会直接作为模型传递给集合,你必须在里面循环。这是设计使然。
就模板的位置而言,ASP.NET MVC 将首先在名为 EditorTemplates 的子文件夹中查找当前控制器,然后在~/Views/Shared/EditorTemplates. 这允许您覆盖当前控制器的一些全局模板。
或者,您可以在使用 EditorFor 帮助器时指定要呈现的模板的名称:
@Html.EditorFor(x => x.MyProperty, "Bar")
将使用Bar.cshtml. 相同的规则适用于集合与UIHint.