【问题标题】:how does main view recognises which editor template is to be included主视图如何识别要包含哪个编辑器模板
【发布时间】:2013-07-30 05:42:21
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案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,它将为集合的每个元素自动呈现。

    另一方面,如果您使用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 相同的规则适用于集合。

    【讨论】:

    • 感谢达林的快速回复。我现在很清楚这一点。谢谢。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多