私は数日前にこの質問に背景を掲載しましたが、答えはまだ不完全で、要約で再投稿しています。ASP.NET MVC動的ビュー
私はMVC 3 Razor Web Appを開発しています。そこには、複数のカテゴリのオブジェクトの詳細が格納されています。 (車両、住宅、計器など)。すべてのオブジェクトは共通のデータ(タイトル、説明など)と、それが属しているカテゴリに固有のいくつかの詳細を共有します。カテゴリリストは拡大すると予想され、メンテナンス性が低下するという観点から、同じオブジェクトの追加ウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。複数ステップのウィザードプロセスで
http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx
、最後のステップは、ユーザが(車のモデル、作る、VINなど)カテゴリ具体的な詳細を入力することができます。次のように表示するページが定義されている「AssetView」モデルにバインドされている
public class AssetView
{
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set;}
public SpecificAsset AssetDetails { get; set; }
}
AssetDetailsプロパティを動的に前の段階で選択されたカテゴリの種類に応じて、実行時に変更されます。このようなビューは、カテゴリ選択に基づいてコントローラ内のこのように見える。
@model AssetView
....
<div class="wizard-step">
...
</div>
<div class="wizard-step">
...
</div>
<div class="wizard-step">
@Html.EditorFor(model => model.AssetDetails)
</div>
_thisAsset.AssetDetails = new MotorAsset();
次に、タイプ固有のエディタテンプレートでビューをオーバーライドします。
ウィザードは正常に動作しますが、コントローラーの[保存]ステップでは、 "AssetDetails"プロパティーに値がなく、基本タイプである "SpecificAsset"タイプであることが示されます。私は特定のタイプにもキャストできません。ただし、formsCollectionはすべての値を表示しますが、 "AssetDetails_"という接頭辞が付いたフォームコレクションには、 "Transmission"、 "Make"などの "AssetDetails"固有のプロパティがあります。
コントローラのセーブステップで20種類以上の特定のカテゴリ(モータ、ハウスなど)を処理する必要があることを覚えておいてください。
あなたはSpecificAssetクラスを表示できますか? EditorForModelテンプレートをオーバーライドしましたか? – Boo
SpecificAssetクラスは空の型です。それぞれの特定のカテゴリ固有のクラスによって継承されます。上記の更新されたポストの「MotorAsset」など。はい、エディットテンプレートはタイプ固有のビューでオーバーライドされます。 – Azwaan