1

オブジェクトの複数のカテゴリの詳細が保存されているMVC3RazorWebアプリを開発しています。(車両、住宅、楽器など)。すべてのオブジェクトは、いくつかの共通データ(タイトル、説明など)と、それが属するカテゴリに固有の詳細を共有します。カテゴリリストは拡大すると予想され、保守性の低下を考慮して、同じオブジェクトの追加ウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。

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

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

私の汎用モデルオブジェクトは次のようなものです

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"には、以下のように宣言されているMotorAsset型の強く型付けされたモデルが含まれます。

  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

私の質問は、最後のステップがビューページではなく部分ビューにあるため、このシナリオでモデルの検証をどのように実行できるか(または使用できるか)です。

4

1 に答える 1

0

AssetViewにプロパティAssetDetailsを設定するのではなく、単純なクラス継承(OOPパラダイム)に頼らないのはなぜですか?

あなたが今持っているものの代わりに、あなたはむしろ宣言するべきです

AssetView(一般的なプロパティ)-> AssetViewを継承するMotorView(特定のプロパティ)

このような:

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

現在の状態のままにしておきたい場合は、Sharedフォルダーにテンプレートを使用EditorFor()して作成し、EditorFor強く入力しますMotorAsset(またはSpecificAsset、さらに一般的なものにしたい場合)。

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

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

これにより、コントローラーがそれを検証し、のプロパティに自動バインドできるようになりますAssetView。HTH

于 2011-01-29T16:40:47.867 に答える