我需要一些关于 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.cshtml
which 将自动为集合的每个元素呈现。
另一方面,如果您使用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
.