MVC 3 несколько шаблонов DisplayFor - PullRequest
14 голосов
/ 29 апреля 2011

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

@Html.DisplayFor(b => b.Items)

Но когда я пытаюсь добавить имя шаблона, я получаю ожидание, что мои шаблоны должны иметь тип списка IEnumerable, а не BasketItem.

@Html.DisplayFor(i => basket.Items, "CustomerItemBaseList")

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

Ответы [ 4 ]

22 голосов
/ 29 апреля 2011

К сожалению, это ограничение шаблонных помощников.Если вы задаете имя шаблона для свойства коллекции, шаблон больше не применяется автоматически для каждого элемента коллекции.Возможное решение:

@for (int i = 0; i < Model.Items.Length; i++)
{
    @Html.DisplayFor(x => x.Items[i], "CustomerItemBaseList")
}
2 голосов
/ 02 ноября 2013

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

    public static class DisplayTextListExtension
{
    public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName)
    {
        var tempResult = new StringBuilder();

        foreach (var item in model)
        {
            tempResult.Append(html.DisplayFor(m => item, templateName));
        }

        return MvcHtmlString.Create(tempResult.ToString());
    }
}

Тогда фактическое использование выглядит следующим образом:

                                @Html.DisplayForList(Model.Organizations, "infoBtn")
1 голос
/ 10 мая 2015

Мне понравился ответ Дэна, но он немного скорректирован, поскольку он может работать для любого IEnumerable:

using System.Collections;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace YourProject.Whatever
{
    public static class DisplayExtensions
    {
        public static MvcHtmlString DisplayForIEnumerable<TModel>(this HtmlHelper<TModel> html, IEnumerable model, string templateName)
        {
            var tempResult = new StringBuilder();

            foreach (var item in model)
            {
                var item1 = item;
                tempResult.Append(html.DisplayFor(m => item1, templateName));
            }

            return MvcHtmlString.Create(tempResult.ToString());
        }
    }
}

И конечно:

@Html.DisplayForIEnumerable(Model.Organizations, "NameOfYourDisplayTemplate")
0 голосов
/ 04 февраля 2016

Я предлагаю другое решение, полезное еще больше со списками разнородных объектов (то есть подклассами BasketItem), с использованием параметра AdditionalViewData метода DisplayFor, например:

@DisplayFor(b=>b.Items, new { layout="row" })

таким образом, помощник прекрасно работает с IEnumerable<T>, вызывая для каждого элемента (подкласса T) относительный DisplayTemplate , передавая ему значения AdditionalViewData в ViewData словарь.

Шаблон может выводить другой код для разных значений макета.

В приведенном выше примере шаблон с именем View \ Shared \ DisplayTemplates \ BasketItem (или имя подкласса) должен выглядеть следующим образом:

@model MyProject.BasketItem // or BasketItem subclass
@{ 
    string layout = ViewData["layout"] as string ?? "default";

    switch(layout)
    {
        case "row":
            <div class="row">
            ...
            </div>
        break;
        // other layouts
        ...
        default: // strongly recommended a default case
            <div class="default-view>
            ...
            </div>
        break;
    }
}

Настоятельно рекомендуется всегда указывать код по умолчанию.

Надеюсь, это предложение поможет.

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