14

バスケット アイテム リストのカスタム テンプレートを作成しようとしています。アイテムがウェブページ上にあるかメールにあるかによって、アイテムを表示する方法が異なるため、いくつかの異なるテンプレートが必要です。今私の問題は、デフォルトの名前を使用すると問題なく動作することです。

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

しかし、テンプレート名を追加しようとすると、テンプレートは BasketItem ではなく、リスト タイプの IEnumerable である必要があると期待されます。

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

私の間違いがどこにあるのか、またはなぜそれが不可能なのかについてのアイデアをいただければ幸いです。ありがとう。

4

4 に答える 4

1

次のように、メソッドのadditionalViewDataパラメータを使用して、異種オブジェクト (つまり BasketItem サブクラス) のリストでさらに役立つ別のソリューションを提案します。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;
    }
}

常にデフォルト コードを提供することを強くお勧めします。

この提案がお役に立てば幸いです。

于 2016-02-04T16:36:06.500 に答える
1

私はダンの答えが好きでしたが、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")
于 2015-05-10T03:05:45.003 に答える