2012-05-03 15 views
6

アプリケーションは、RAZORビューエンジンを搭載したMVC3アプリケーションです。RazorViewEngineが私のDisplayTemplateを取り上げないのはなぜですか?

ここで使用されているコントローラはTestControllerです。 ネストされたビューを使用しています。 (項目リスト)はこのように書き

たBase view、ここ

//Listing.cshtml 
@model ItemsList 
@for (int i = 0; i < Model.Items.Count(); i++) 
    { 
     @Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 
} 

だから

//ItemDetails.cshtml 
@model Item 
@Html.DisplayFor(x=>x.Description) 

詳細

項目

//Item.cshtml 
@model Item 
@Html.DisplayFor(x=>x.HeaderText) 
@Html.DisplayFor(x=>x, "ItemDetails") 

をするためのテンプレートであり、ここで項目のための図です。私はITEMテンプレートからITEMDETAILSテンプレートにモデルを転送しようとしています。 ItemDetails.cshtmlは、 "Views \ Test \ DisplayTemplates"の下にあります。私は実際には "Views \ Shared \ DisplayTemplates"と同様に "Views \ Shared"というフォルダの下に配置しようとしました。しかし、ビューエンジンはそれを拾い上げるだけではないようだ。

ただし、Microsoftのドキュメントhereでは、ビューエンジンは、使用されたTemplateNameを使用してVIEWをフェッチするためにController \ DisplayTemplatesフォルダを参照します。

+1

これはおそらくバグではありません。より有益なタイトルを書いてください。 –

+2

Tom、私の質問は、ビューエンジンがViewを選択しない理由です。 ItemDetailsの表示は空白になります。例外なし。どのようにしてビューエンジンが舞台裏で働いているのかをデバッグできますか? – EagerToLearn

+1

は良い昼寝のパワーを過小評価しない –

答えて

5

を使用してみてくださいこれは、このような(Item.cshtmlに)やって、おそらくカスタム表示テンプレートで偶発無限再帰を防ぐために、表示/ EditorTemplatesのための意図した動作であるように思われる:

@model Item 
@Html.DisplayFor(x => x) 

。 .. Item.cshtml DisplayTemplateを無限に表示します。

明らかに、あなたの例では、アイテム/モデルをの異なるテンプレートに渡しているので、無限の再帰は発生しません。しかし、それはまだフレームワーク内の同じセーフガードに捕らえられているようです。それは 'バグ'または単に '設計'によって分類されるかどうかは本当にわかりませんか?

// Normally this shouldn't happen, unless someone writes their own custom Object templates which 
// don't check to make sure that the object hasn't already been displayed 
object visitedObjectsKey = metadata.Model ?? metadata.RealModelType; 
if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(visitedObjectsKey)) { // DDB #224750 
    return String.Empty; 
} 

ViewData.TemplateInfo.VisitedObjects店舗親テンプレートの訪問オブジェクト/モデル:

これはDisplayFor/TemplateFor helperでチェックです。あなたが実行すると:

@Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 

それはあなたのItem.cshtml DisplayTemplateをレンダリングしVisitedObjectsにアイテム/モデルを追加します。Item.cshtmlが同じ項目/モデルと別の子テンプレートを表示しようとするとこれは意味:

@Html.DisplayFor(x => x, "ItemDetails") 

アイテム/モデルはVisitedObjectsに既にあるので、文は、上記の/それだけで静かにtrueを返し、代わりにItemDetails.cshtmlのレンダリング返す場合空の文字列をレンダリングします。

+0

最近この "feature"に遭遇しました。私は、MVCチームがここで間違いを犯したと思います。空の文字列を返すと、開発者は出力が見えるまで、すべてがうまくいったという印象を与えます。また、何が起きているのかを把握することも不可能です。少なくとも、コードは例外をスローし、その動作を説明し、開発者にその問題を警告することができます。 –

1

まず、forループは使用しないでください。 Display/EditorTemplatesはコレクションを処理できます。

次に、ItemsListとは何ですか?それはどのように定義されていますか?特定の収集タイプの名前を付けるだけの場合は、それをしないでください。リストや何かを代わりに使用してください(特別なアイテム処理が必要な場合を除き、その場合はコレクションクラスにIEnumerableを実装してください)。リストを使用して変換すると、ItemsList.cshtmlまたは単にItem.cshtmlが表示されます。

また、メインビューのDisplayFor()は間違っています。 DisplayTemplatesにhtml属性を渡すことはできません。

0

@Html.RenderPartial("ItemDetails", item)

関連する問題