2011-02-01 40 views
0

私は数日前にこの質問に背景を掲載しましたが、答えはまだ不完全で、要約で再投稿しています。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種類以上の特定のカテゴリ(モータ、ハウスなど)を処理する必要があることを覚えておいてください。

+0

あなたはSpecificAssetクラスを表示できますか? EditorForModelテンプレートをオーバーライドしましたか? – Boo

+0

SpecificAssetクラスは空の型です。それぞれの特定のカテゴリ固有のクラスによって継承されます。上記の更新されたポストの「MotorAsset」など。はい、エディットテンプレートはタイプ固有のビューでオーバーライドされます。 – Azwaan

答えて

0

あなたがAssetDetailsの種類を知っているなら、あなたはこのようにそれを行うことができます:(共通 プロパティ結合する)

  • はの新しいインスタンスを作成します

    1. にパラメータとしてアクションをAssetViewしてください 特定のAssetDetails(例: CarDetails)
    2. TryUpdateModelのオーバーロードのいずれかを使用して値をバインドします。 それは 常に
    3. は、あなたが特定のタイプを知るためにいくつかの方法が必要です AssetView.SpecificAsset

    にこのオブジェクトを追加します動作するはずですので、あなたは接頭辞を指定 てみましょういくつかのオーバーロードがあります。しかし、私はあなたが変数を持っているので、後で適切に保存できるように型を追跡すると思います。もしあなたがそれを加えなければ、それは簡単に追加できます。 AssetDetailsはバインドされていないため、AssetViewにする必要があることに注意してください。

    検証が必要な場合は、TryValidateModelも試してみることができます。

  • +0

    偉大なもの..私が探していたことを正確にthats! – Azwaan

    0

    私が理解しているように、モデルの数が増え、すべてのモデルに対してアクションとビューを再利用したいと考えています。私が見る1つの選択肢は、カスタムModelBinderを作ることです。 FormCollectionを調べ、特定のアセットモデルを作成するよりも、

    解決策の問題は、SpecificAssetにはプロパティがないため、デフォルトのモデルバインダーはフィールドをバインドしません。