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

Pet*_*ron 10 templates nested razor asp.net-mvc-3

几个子类(例如,Cheese)共享从基类(Product)派生的公共属性,其属性如SKU,NameDescription.

为了避免在渲染显示/编辑器模板时出现重复,我希望每个子类模板(Cheese.cshtml)在其共享公共基类模板(Product.cshtml)下面呈现其唯一字段.

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

DisplayTemplate文件结构:

.\Views\Shared\DisplayTemplates
    .\Product.cshtml -- renders common base class fields
    .\Cheese.cshtml -- renders unique class fields and calls Product.cshtml
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

转换为基类并呈现Product.cshtml模板可以从View中正常工作,但不能在子类模板中工作.

如何从子类模板中为我的基类渲染公共模板?

Pet*_*ron 10

找到解决方案

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

@Html.Partial("~/Views/Shared/DisplayTemplates/Product.cshtml", product) %>
Run Code Online (Sandbox Code Playgroud)

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

@Html.Partial("DisplayTemplates/Product", product)
Run Code Online (Sandbox Code Playgroud)

  • 现在似乎在MVC4中修复了 - displayFor的可以嵌套 (2认同)
  • 是吗?我使用MVC5,但仍然无法嵌套它们 (2认同)