我需要mvc3中的编辑器模板帮助。
我想知道视图是如何知道在EditorFor
中调用哪个编辑器模板的?是否在某处添加了任何类型的参考ios?
例如。 - 我有两个名为template1.cshtml
和template2.cshtml
的编辑器模板,我正在撰写以下声明 -
@Html.EditorFor(model => model.template)
(template是名为Template
的模型列表)
现在EditorFor
将如何识别要包含template1
或template2
?
感谢。
答案 0 :(得分:1)
现在,EditorFor将如何识别要包含template1或template2?感谢。
如果模板属性为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
一样,同一规则适用于集合。