3

私の表示テンプレート「PlanAlternate」:

@model MyPlan

<div class="span4 compare-column compare-column1">

<div class="compare-row-plan">
    <h3>@Model.Plan.Name</h3>
</div>

@foreach (var benefit in Model.Plan.Benefits)
{
    <div class="compare-row-benefit-description">
        @benefit.Description
    </div>
}

<div class="compare-row-submit">
    <input class="btn" type="submit" value="Apply Now" />
</div>
</div>

表示テンプレートを使用するマイ ビュー:

@model IEnumerable<MyPlan>

<div class="span9 compare-data-wrapper">
   @Html.DisplayForModel("PlanAlternate")
</div>

これにより例外がスローされます。

ディクショナリに渡されたモデル アイテムのタイプは 'System.Collections.Generic.List`1[MyPlan]' ですが、このディクショナリにはタイプ 'MyPlan' のモデル アイテムが必要です。

ただし、表示テンプレートの名前を PlanAlternate.cshtml から MyPlan.cshtml に変更して使用すると、

@Html.DisplayForModel()

すべてがうまく機能します。なぜこれが起こっているのかを理解するのを手伝ってもらえますか?

ありがとう!

編集:

表示テンプレート ファイル名がビュー モデル名と一致する上記のとおりに実行しても、ビュー名 ("MyPlan") を DisplayForModel に渡すと、例外がスローされます。引数なしで DisplayForModel を呼び出すと機能します。これは私には非常に奇妙に思えます。ほとんどバグのようですが、私が理解していないだけだと確信しています。

4

2 に答える 2

3

(DisplayForModel()および) メソッドは、TemplateHelpersクラスDisplayFor(m => m)のメソッドを内部的に使用します。コードは非常に複雑です。ソース コードの詳細については、読者にお任せしますが、何が起こるかを要約すると次のようになります。internal static

値を渡さない場合templateName、ヘルパーは基本的に言う

モデル名に一致するビュー名を見つけて、コレクション内のアイテムのそのビューに基づいて html を生成します

しかし、templateName値を渡すと、ヘルパーは基本的に言う

templateName に一致するビューを見つけてコレクションを渡し、そのビューに基づいて html を生成します

IEnumerable<MyPlan>であるモデルを期待するビューにのモデルを渡すため、例外が発生しますMyPlan

これは、属性を使用する場合と同じように機能し[TemplateHint]ます。つまり、モデルをビューに渡すため、モデルがIEnumerable<T>である場合、ビューも である必要があります@model IEnumerable<T>

したがって、これは設計によるものであり (バグではありません)、多くの柔軟性が得られます (たとえば、同じモデルに対して複数のテンプレートを使用できるようにするなど)。

于 2016-03-10T03:30:45.530 に答える
0

テンプレートは、単一の MyPlan インスタンスのモデルを想定しており、ビューには MyPlan オブジェクトのリストがあります。DisplayForModel にオブジェクトを提供していないため、ビューからモデルを渡すだけです。必要なことを行うには、DisplayForModel を for ループでラップし、ループの反復ごとに IEnumerable から MyPlan のインスタンスを渡す必要があります。

foreach(var myPlan in Model)
{
    @Html.DisplayForModel("PlanAlternate", myPlan)
}

私は構文をチェックしていませんが、それは私には正しいようです。

于 2013-06-25T15:54:50.490 に答える