私は同じような質問が何度も聞かれたことを知っています。答えは問題のビューへの絶対パスを使用することです。ただし、レンダリングするには、パーシャルビューが属するコントローラではなく、現在のコントローラが使用されます。他のコントローラから部分的なビューをレンダリングする
ここでの目標は、特定のモデルのドロップダウンリストを 自己完結型コンポーネントとして扱うことです。そのため、このモデルの外部キーを持つ他のモデルで再利用できます。たとえば、2つのモデルがあるとします(Device
とDeviceType
)。 Device
には、DeviceTypeId
フィールドが含まれています。このフィールドは、編集テンプレートでドロップダウンリストとして表示され、利用可能なすべての名前がDeviceTypes
です。
通常、モデルとデバイスタイプのリストを別のDeviceViewModel
クラスにラップし、コントローラーにページをレンダリングする前にその両方を設定する必要があります。そして、あなたは、次のようなもので、それをテンプレートになります。
<div class="editor-field">
@Html.DropDownListFor(model => model.Device.DeviceTypeId, Model.AllDeviceTypes)
@Html.ValidationMessageFor(model => model.Device.DeviceTypeId)
</div>
私は、このソリューションが好きではない - すべてのモデルのために、私は、ドロップダウンリストのルックアップテーブルを含み、一致するビューモデルを作成する必要があります。これは、DevicesController
がDeviceTypes
のリストを取得する方法を知っていなければならないことを意味します。これはDeviceTypesController
の仕事のようです。理想的には、私は、ドロップダウンリストを移入し、レンダリングDeviceTypesController
上の部分図を、定義したいのですが、その後、他のすべてのビューは、ちょうどそのビューを含めることができます
<div class="editor-field">
<!-- Somehow make the DeviceTypesController render the partial here -->
@Html.ValidationMessageFor(model => model.DeviceTypeId)
</div>
が、このことは可能ですか?
「@ {Html.RenderAction( "TemplateMethod"、 "DeviceTypes");}のようなもの – Hackerman
特定のコントロールを再利用する必要がある場合は、表示テンプレートを使用できます。同じモデルを何度も何度も再作成したくないので、プロパティを持つ基本クラスを作成してから使用してください。 –
@VidiyaPrasanth C#では多重継承ができないので、継承は実際にはオプションではありません。モデルに_two_ルックアップテーブルが必要な場合はどうなりますか?複数の異なるモデルでルックアップテーブルの組み合わせが異なる場合はどうなりますか?私は現在、最も有望なオプションのように見えるので、 'Html.RenderAction'を動作させようとしています。 –