2010-12-08 13 views
1

私たちは、RenderPartialを使用せず、代わりにEditorForとDisplayForを100%のケースで使用することを惜しまないようにしています。しかし、これまでに作業することができなかったシナリオが1つあります。部分ビューにViewModel全体が必要な場合、つまりHtml.DisplayFor(m => m, "MyTemplateThatNeedsTheEntireViewModel")になる必要がある場合です。 Html.DisplayFor(m => m.Prop, "MyTemplateThatOnlyNeedsTheOneProperty")の場合はうまく動作しますが、ViewModel全体を渡すことはできません。ViewModel全体をDisplayTemplateに渡しますか?

DisplayForEditorForの両方で動作する方法がありますか?

私が今見ていることは、何もない(またはおそらく空白)がマークアップにレンダリングされることです。しかし、コンパイラとReSharperは私の構文がうまくいくと思っているようです。 RenderPartialを呼び出すコードを変更すると完全に動作しますが、これは私が避けようとしているものです。

私はこれらの3行を試してみます。れるrenderPartialは(最終的なマークアップは、空の文字列または空白である)EditorForsが動作しない、完璧に動作します:

<% Html.EditorFor(m => m, "RetailPriceRequests/PriceRequest/PriceRequestLoadGrid"); %> 
<%= Html.EditorFor(m => m, "RetailPriceRequests/PriceRequest/PriceRequestLoadGrid") %> 
<% Html.RenderPartial("~/Views/Shared/EditorTemplates/RetailPriceRequests/PriceRequest/PriceRequestLoadGrid.ascx", Model); %> 
+0

DisplayTemplatesのそれぞれのタイプは何ですか? – hunter

+0

非常にカスタムのViewModelsです。例えば、我々は 'BusinessDetailsViewModel'を' BusinessSummary'(常時画面情報)と 'BusinessDetails'(多くのタブの内容)に渡し、' BusienssDetailsViewModel'のさまざまなプロパティを渡します追加のタブで表示/エディタテンプレートに追加できます。 – Jaxidian

答えて

1

あなたDisplayTemplateの場合:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ExampleModel>" %> 

DisplayFor(m => m, "ExampleModel") 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ExamplePropertyModel>" %> 

DisplayFor(m => m.ExampleProperty, "ExamplePropertyModel") 

がすべき動作するはずです仕事

あなたは何かがnullである可能性があります、その場合はそれはおそらく全く表示を打つべきではありませんが、あなたは、書面によりこれを回避することができます

RenderPartial("ExampleModel", Model ?? new ExampleModel()); 

または

RenderPartial("ExampleModel", 
    (Model ?? new ExampleModel() { ExampleProperty = new ExampleProperty() }) 
     .ExampleProperty ?? new ExampleProperty()); 
+0

あなたの最初の例はまさに私がやろうとしているもので、ExampleModelテンプレート内のHTMLは(Hello Worldタイプのテンプレートの場合でも)レンダリングされません。あなたの最後の2つの例は動作しません - あなたはそのラムダ式の中でロジックを実行することはできません、プロパティを指定するだけです。 '例外の詳細:System.InvalidOperationException:テンプレートは、フィールドアクセス、プロパティアクセス、一次元配列インデックス、または単一パラメータカスタムインデクサ式でのみ使用できます。 ' – Jaxidian

+0

別のDisplayTemplateを呼び出していますか? – hunter

+0

ところで、私は 'DisplayFor(m => Model ?? new ExampleModel()、" ExampleModel ")'問題ありません...あなたが見ている例外は問題かもしれません – hunter

関連する問題