2011-01-29 27 views
1

MVC 3 Razor Web Appを開発しています。複数のカテゴリのオブジェクトの詳細が格納されています。 (車両、住宅、計器など)。すべてのオブジェクトは共通のデータ(タイトル、説明など)と、それが属しているカテゴリに固有のいくつかの詳細を共有します。カテゴリリストは拡大すると予想され、メンテナンス性が低下するという観点から、同じオブジェクトの追加ウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。複数ステップのウィザードプロセスで複数の部分ビューに分割されたASP.NET MVCモデル

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

、最後のステップは、ユーザが(車のモデル、作る、VINなど)カテゴリ具体的な詳細を入力することができます。現在、私はこの最後のステップをAJAXの部分ビューとして構想しました。したがって、実際には、特定のカテゴリを反映した部分的なビューが数多くありますが、残りのウィザードコードは共有されます。

私の一般的なモデルオブジェクトは、複雑なプロパティAssetDetailsは、部分図の各タイプで表され、この

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; } 
} 

のようなものです。 PartialView "MotorDetails"には、以下のように宣言されているMotorAsset型の強く型付けされたモデルが含まれます。

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

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

実際の検証は、はるかに複雑ですが、わかりやすいようにこれらを省略しました。

私の質問は、私は、このシナリオでモデルの検証を行うことができる方法である(またはそれを使用することが可能である)

@model MotorAsset 

としてモーター部分図

@model AssetView 

    ..... 

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

としてメインウィザードページが宣言されています最後のステップはビューページには表示されず、部分的なビューになります。

答えて

0

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

代わりに、あなたが今、あなたはむしろ

AssetView(一般プロパティ)を宣言する必要があります持っているものの - このように> MotorView継承AssetView(特定のプロパティ)

:あなたの場合は

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テンプレートをSharedフォルダに作成し、それに強いタイプのファイルをMotorAsset(またはSpecificAsset、さらに一般的にしたい場合)。これは、それを検証するために、コントローラを有効にして、AssetView内のプロパティにそれを自動バインドします

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

次に、このようにそれをレンダリング。 HTH

+0

私はウィザードのUIを再利用することができません。カテゴリの種類ごとに作成する必要があります。私の意見では、より良い、より清潔でメンテナンス可能な – Azwaan

+0

です。しかし、それをそのままにしたい場合は、RenderPartial()の代わりにEditorFor()を使用して、検証とバインディングを解決できます。更新された回答を参照してください。 – mare

+0

私たちは20種類以上のカテゴリーを持っており、今のところそれはもっと成長すると期待されています。私はeditorForが "AssetDetails"のタイプが "SpecificAsset"であるために使用できるとは思わない。使用されているカテゴリに応じてタイプが動的に変更されます。 – Azwaan

関連する問題