C# MVC 3 Razor — вызов DisplayTemplate с помощью DisplayTemplate

У меня есть простой список продуктов, продукты делятся на две разные категории и отображаются на странице по-разному в зависимости от идентификатора их категории.

Возможно ли вообще вложить DisplayTemplates одного и того же типа модели, например.

//DisplayTemplates/Product.cshtml
@model MyNameSpace.Product


@if (Model.CategoryId == (int)ASixthSenseCore.CategoryId.GiftCards)
{
    @Html.DisplayForModel("GiftCards")
}
else
{
    @Html.DisplayForModel("Merchandise")
}



//DisplayTemplates/GiftCards.cshtml
@model MyNameSpace.Product

<div>I am a Gift Card</div>


//DisplayTemplates/Merchandise.cshtml
@model MyNameSpace.Product

<div>I am Merchandise</div>


//My View
@mode List<MyNameSpace.Product>

@Html.DisplayForModel()

Я пытался сделать это, и он не ломается, но он также не работает, шаблон продукта работает, как и ожидалось - я добавил некоторый текст отладки, который правильно выводит для каждого соответствующего элемента в списке продуктов. Я подозреваю, что в механизме шаблонов есть какое-то блокирующее предложение, чтобы предотвратить его исчезновение в его собственной задней части с рекурсивными вызовами того же шаблона, что является возможностью этого сценария, сказав, что я думал, что спрошу, так как это было бы удобно способ работы с несколькими DisplayTemplates для списков без необходимости повторения их с помощью цикла foreach.


person Rob    schedule 21.03.2012    source источник


Ответы (1)


Ваш код должен работать, если ваши шаблоны не находятся в папке DisplayeTemplates.

Я бы создал отдельные подклассы Product и создал для них шаблоны. Это сделает код чище, и вам не придется везде размещать операторы if.

person Jakub Konecki    schedule 21.03.2012
comment
Спасибо, что Displaye был опечаткой только в вопросе. Второй шаблон не отображается, но я никогда не думал о подклассах элементов - это очень аккуратное решение, спасибо! - person Rob; 21.03.2012
comment
опечатка: я так и думал. Вам вообще не понадобится DisplayTemplates/Product.cshtml, если вы просто перебираете там коллекцию. MVC будет использовать правильные шаблоны, даже если вы передаете разные подклассы в IEnumerable<Product>. - person Jakub Konecki; 21.03.2012