11

Itemクラスがあります。私は、それぞれが異なるタイプのデータを含む約10〜20の派生物を持っています。さまざまなタイプの のレンダリングに関してはItem、次のようなものを使用せざるを得ません。

<div> 
@if (Model is XItem)
{
   ... rendering logic 1 ...
}
@if (Model is YItem)
{
   ... rendering logic 2 ...
}
@if (Model is ZItem)
{
   ... rendering logic 3 ...
}
... goes on and on forever ...
</div>

が表示されるため、残念ながら@Html.DisplayFor()この場合は機能しません。ModelItemDisplayTemplates\Item.cshtml

同じ「if/is」チェーンのため、HTML ヘルパーも役に立ちません。

レンダリング ロジックをクラス自体に組み込んで呼び出すこともできます@Model.Render()が、それらはプレゼンテーションではなくビジネス ロジックに属します。それは罪でしょう。

選択肢は1つしかありません@Html.Partial(Model.GetType().Name)が、それは間違っていると感じています。メタマジックのない解決策を期待しています。より良い方法はありますか?

4

2 に答える 2

6

表示テンプレートを使用します。

フォルダー内に~/Views/Shared/DisplayTemplates、タイプと同じ名前のビューを追加できます。

そうすると@Html.DisplayFor(item)、その特定のタイプに関連するビューが得られます。

アップデート

あなたのコメント RE DisplayFor を見たので、これが役に立たない場合は、回答を削除します。

于 2013-10-10T13:14:49.800 に答える
5

あなたのアプローチはいいと思います。次のような拡張メソッドを使用して、より良くすることができます。

public static MvcHtmlString GetTypePartial<T>(this HtmlHelper htmlHelper, T model, string viewPrefix = "")
{
    string typeName = typeof (T).Name;
    string viewName = string.Concat(viewPrefix, typeName);
    return htmlHelper.Partial(viewName, model);
}
于 2013-10-10T13:14:51.560 に答える