Вложенный @ Html.DisplayFor (model => baseClass, "BaseClass") для шаблона базового класса, не отображаемого - PullRequest
9 голосов
/ 13 марта 2011

Несколько подклассов (например, Сыр ) имеют общие свойства, полученные из базового класса ( Продукт ) со свойствами, такими как 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 прекрасно работает из представления, но не из шаблона подкласса.

Как я могу отобразить общий шаблон для моего базового класса из моих шаблонов подкласса?

Ответы [ 2 ]

9 голосов
/ 13 марта 2011

Решение найдено

@Html.DisplayFor(...) не может быть вложенным , поэтому вы должны использовать @Html.Partial в своем производном шаблоне следующим образом:

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

Или, если ваша файловая структура позволяет это, более краткий путь:

@Html.Partial("DisplayTemplates/Product", product)
1 голос
/ 13 февраля 2013

Это может быть спорным, если это хорошая идея для шаблонирования сложных объектов, или если мой подход к вложенным шаблонам взломать или нет.Преимуществом этого является наличие одного шаблона для родительского и дочернего, которые могут иметь шаблоны вместо того, чтобы выбирать / использовать частичные представления.

Все это, кроме того, шаблонные представления могут быть вложенными, если Вы используете частичное представление в качестве посредника.

Внешний шаблон будет иметь что-то вроде ниже, где вы хотите разместить внутренний шаблон:

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

Ваш шаблон продукта не изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...