質問

MVC 3 Razor Webアプリを開発しています。このアプリでは、オブジェクトの複数のカテゴリの詳細が保存されています。 (車両、家、楽器など)。すべてのオブジェクトは、いくつかの共通データ(タイトル、説明など)と、それが属するカテゴリに固有の詳細を共有します。カテゴリリストは成長することが期待されており、メンテナンス性を低下させることを考慮して、同じADDオブジェクトウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

複数のステップウィザードプロセスでは、最終ステップでは、ユーザーがカテゴリ固有の詳細(車両のモデル、メーカー、VINなど)を入力できます。現在、私はこの最後のステップをAjaxの部分的な見解として想像してきました。したがって、実際には、特定のカテゴリを反映するが、ウィザードコードの残りの部分を共有するmulltipleの部分的なビューを持っています。

私の一般的なモデルオブジェクトはこのようなものです

public class AssetView
{
    [Required]      
    public string Title
     {
        get;
        set;
     }

    [Required]
    public string Description
    {
     get;
      set;
     }

    // Few more generic fields here

    public SpecificAsset AssetDetails { get; set; }
}

複雑なプロパティAssetDetailsは、各タイプの部分ビューで表されます。したがって、PartialView「Motordetails」には、以下のように宣言されているタイプのモーターセットの強く型付けされたモデルが含まれます。

  public class MotorAsset : SpecificAsset
    {
        [Required]
        public string Transmission
        {
            get;
            set;
        }

        [Required]
        public string Make
        {
            get;
            set;
        }
     }

実際の検証ははるかに複雑ですが、これらを省略しているので、理解しやすいです。

メインウィザードページはとして宣言されています

    @model AssetView

  .....

  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
      @{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
  </div>

モーター部分ビューとして

 @model MotorAsset

私の質問は、最終ステップはビューページではなく部分的なビューにあるため、このシナリオでモデル検証を達成する(または使用することができる)ことです。

役に立ちましたか?

解決

AssetViewに不動産のAssetDetailを使用するのではなく、なぜ単純なクラスの相続(OOPパラダイム)に頼らないのですか?

あなたが今持っているものの代わりに、あなたはむしろ

AssetView(汎用プロパティ) - >モータービュー継承ASTETVIEW(特定のプロパティ)

このような:

public class AssetView {     
    [Required]           
    public string Title { get; set; }

    [Required]
    public string Description     { get; set; }      

    // Few more generic fields here
}

public class MotorView : AssetView {
    ...
}

@model MotorView    // you still have access to the AssetView's properties in your view and in your controller actions

あなたが今持っているようにそれを残したいなら、それを使用してください EditorFor() そして、作成します EditorFor 共有フォルダーのテンプレートと強いタイプに MotorAsset (また SpecificAsset, 、さらに一般的なものが必要な場合)。

次に、次のようにレンダリングします。

@Html.EditorFor(model=>model.AssetDetails)

これにより、コントローラーはそれを検証し、あなたのプロパティに自動産生することができます AssetView。 Hth

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top