主视图如何识别要包含哪个编辑器模板

时间:2013-07-30 05:42:21

标签: asp.net-mvc-3

我需要mvc3中的编辑器模板帮助。 我想知道视图是如何知道在EditorFor中调用哪个编辑器模板的?是否在某处添加了任何类型的参考ios? 例如。 - 我有两个名为template1.cshtmltemplate2.cshtml的编辑器模板,我正在撰写以下声明 - @Html.EditorFor(model => model.template) (template是名为Template的模型列表) 现在EditorFor将如何识别要包含template1template2? 感谢。

1 个答案:

答案 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一样,同一规则适用于集合。