首页 文章

嵌套的@Html.DisplayFor(model => baseClass,“BaseClass”),用于不渲染基类模板

提问于
浏览
9

几个 sub-classes(e.g. Cheese)共享从基类(Product)派生的公共属性,其属性如 SKU,Name 和 Description。

为了避免在渲染 display/editor 模板时出现重复,我希望每个 sub-class 模板(Cheese.cshtml)在其共享公共基类模板(Product.cshtml)之下呈现其唯一字段。

但是,从派生类转换到基类(Product)cheese并尝试在 sub-class 模板中显示其模板无效。

DisplayTemplate 文件结构:

.\Views\Shared\DisplayTemplates
    .\Product.cshtml -- renders common base class fields
    .\Cheese.cshtml -- renders unique class fields and calls Product.cshtml

Cheese.chtml:

@model Application.Data.Models.Cheese

@{
    var product = (Application.Data.Models.Part)Model;
}

Base Product Fields:
@Html.DisplayFor(x => products, "Product") @* no effect! *@

<div class="field">
    <div class="display-label">@Html.LabelFor(m => Model.UniqueProperty)</div>
    <div class="display-field">@Html.DisplayFor(m => Model.UniqueProperty)</div>
</div>

转换到基类并渲染 Product.cshtml 模板可以从 View 中正常工作,但不能在 sub-class 模板中工作。

如何在 sub-class 模板中为我的基类渲染公共模板?

2 回答

  • 9

    找到解决方案

    @Html.DisplayFor(...) 不能嵌套,所以你必须在派生模板中使用@Html.Partial,如下所示:

    @Html.Partial("~/Views/Shared/DisplayTemplates/Product.cshtml", product) %>
    

    或者,如果您的文件结构允许,则更简洁的路径:

    @Html.Partial("DisplayTemplates/Product", product)
    
  • 1

    如果模拟复杂对象是一个好主意,或者我对嵌套模板的处理是否是黑客攻击,那么这是值得商榷的。这样做的好处是父母和子的单个模板都可以有模板,而不是 choose/use 部分视图。

    除此之外,模板化视图可以嵌套,如果使用局部视图作为介于两者之间。

    外部模板将具有下面您要放置内部模板的内容:

    Html.RenderPartial("SharedDisplayGoBetweenForFoo", item);
    

    共享部分看起来像这样:

    @model Foo
    
    @Html.DisplayFor(a => a);
    

    然后将调用内部模板,并且看起来像任何其他模板。

    所以你的例子看起来像

    Cheese.cshtml:

    @model Application.Data.Models.Cheese
    
    @{
        var product = (Application.Data.Models.Part)Model;
    }
    
    Base Product Fields:
    @Html.DisplayFor(x => products, "Product") @* no effect! *@
    
    <div class="field">
        <div class="display-label">@Html.LabelFor(m => m.UniqueProperty)</div>
        <div class="display-field">@Html.RenderPartial("SharedPartialProductGobetween", Model.UniqueProperty)</div>
    </div>
    

    SharedPartialProductGobetween.cshtml:

    @model Product
    
    @Html.DisplayFor(a => a);
    

    您的产品模板不会改变。

相关问题