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

时间:2011-03-13 19:36:03

标签: templates asp.net-mvc-3 nested razor

几个子类(例如 Cheese )共享从基类( Product )派生的公共属性,其属性如 SKU 姓名描述

为了避免在渲染显示/编辑器模板时出现重复,我希望每个子类模板( 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

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中正常工作,但不能在子类模板中工作。

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

2 个答案:

答案 0 :(得分:9)

找到解决方案

@Html.DisplayFor(...) cannot be nested,因此您必须在衍生模板中使用@Html.Partial,如下所示:

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

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

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

答案 1 :(得分:1)

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

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

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

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);

您的商品模板不会更改。