30

エディター テンプレートがあり、そのエディター テンプレート内で同じモデル (つまり、ネストされた) を持つ別のエディター テンプレートを呼び出したいのですが、表示されないようです。
すなわち。\EditorTemplates\Template1.cshtml

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.EditorForModel("Template2")   // or @Html.EditorFor(m => m, "Template2")

および \EditorTemplates\Template2.cshtml

@model foo

@Html.TextBoxFor(m => m.Name)

誰かがなぜ疑問に思うだろうと確信していますか?ネストされたテンプレートは、条件が満たされた場合にのみ表示されます (つまり、 @if (@Model.IsConditionMet) { .... } ) が、簡単にするためにプロトタイプから除外しました。

4

1 に答える 1

58

簡潔な答え:

Html.Partial代わりに使用してください。

したがって、Template1.cshtml ファイルでは次のようになります。

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.Partial("EditorTemplates/Template2", Model)

長い答え:

残念ながら、これは仕様によるものと思われます。MVC は、レンダリングされたモデルを追跡します。モデルが既にテンプレートによってレンダリングされている場合、テンプレートが異なっていても、2 回レンダリングされることはありません。したがって、2番目@Html.EditorForModel("Template2")は何もしないのです。

具体的にViewData.TemplateInfo.VisitedObjectsは、内部フィールドである で追跡されるため、事後に変更することは期待できません。このフィールドの意図は、無限再帰を防ぐことです。高貴ですが、使用されるテンプレートが考慮されていないという点で厄介です。

ソースコードを見てこれを見つけました。これは、MVC のこれらの奇妙な特異性を見つけるのに最適です。

于 2014-02-05T15:22:28.820 に答える