2017-08-29 14 views
0

私は同じような質問が何度も聞かれたことを知っています。答えは問題のビューへの絶対パスを使用することです。ただし、レンダリングするには、パーシャルビューが属するコントローラではなく、現在のコントローラが使用されます。他のコントローラから部分的なビューをレンダリングする

ここでの目標は、特定のモデルのドロップダウンリストを 自己完結型コンポーネントとして扱うことです。そのため、このモデルの外部キーを持つ他のモデルで再利用できます。たとえば、2つのモデルがあるとします(DeviceDeviceType)。 Deviceには、DeviceTypeIdフィールドが含まれています。このフィールドは、編集テンプレートでドロップダウンリストとして表示され、利用可能なすべての名前がDeviceTypesです。

通常、モデルとデバイスタイプのリストを別のDeviceViewModelクラスにラップし、コントローラーにページをレンダリングする前にその両方を設定する必要があります。そして、あなたは、次のようなもので、それをテンプレートになります。

<div class="editor-field"> 
    @Html.DropDownListFor(model => model.Device.DeviceTypeId, Model.AllDeviceTypes) 
    @Html.ValidationMessageFor(model => model.Device.DeviceTypeId) 
</div> 

私は、このソリューションが好きではない - すべてのモデルのために、私は、ドロップダウンリストのルックアップテーブルを含み、一致するビューモデルを作成する必要があります。これは、DevicesControllerDeviceTypesのリストを取得する方法を知っていなければならないことを意味します。これはDeviceTypesControllerの仕事のようです。理想的には、私は、ドロップダウンリストを移入し、レンダリングDeviceTypesController上の部分図を、定義したいのですが、その後、他のすべてのビューは、ちょうどそのビューを含めることができます

<div class="editor-field"> 
     <!-- Somehow make the DeviceTypesController render the partial here --> 
     @Html.ValidationMessageFor(model => model.DeviceTypeId) 
    </div> 

が、このことは可能ですか?

+0

「@ {Html.RenderAction( "TemplateMethod"、 "DeviceTypes");}のようなもの – Hackerman

+0

特定のコントロールを再利用する必要がある場合は、表示テンプレートを使用できます。同じモデルを何度も何度も再作成したくないので、プロパティを持つ基本クラスを作成してから使用してください。 –

+0

@VidiyaPrasanth C#では多重継承ができないので、継承は実際にはオプションではありません。モデルに_two_ルックアップテーブルが必要な場合はどうなりますか?複数の異なるモデルでルックアップテーブルの組み合わせが異なる場合はどうなりますか?私は現在、最も有望なオプションのように見えるので、 'Html.RenderAction'を動作させようとしています。 –

答えて

0

あなたはRenderAction使用することができます。このメソッドの結果を直接HTTPレスポンスストリームに書き込まれますhttp://www.dotnettricks.com/learn/mvc/renderpartial-vs-renderaction-vs-partial-vs-action-in-mvc-razor

  1. は、それが使用される手段:以下の記事から

    @{Html.RenderAction("TemplateMethod","DeviceTypes");} 
    

    現在のWebページ/テンプレートで使用されているものと同じTextWriterオブジェクト。

  2. このメソッドでは、部分ビューをレンダリングするための子アクションを作成する必要があります。
  3. RenderActionメソッドは、パーシャルビューの表示データが対応するビューモデルと独立している場合に便利です。例:各ページのカテゴリリストを表示するブログでは、RenderActionメソッドを使用したいと思います。カテゴリは異なるモデルによって作成されます。

    @{Html.RenderAction("Category","Home");}

  4. この方法では、部分図をキャッシュする最良の選択です。

  5. このメソッドはActionメソッドよりも高速です。その結果はHTTP応答ストリームに直接書き込まれ、高速化されるためです。
関連する問題