2012-04-27 21 views
-1

投稿時に別のViewModelに自動バインドしたいViewModelがあります。Mvc 3モデルの自動バインド

例:私は、ディスプレイ/目的をレンダリングするための

public class ViewModelA{ 
    public string Stuff {get;set;} 
} 

public class ViewModelB{ 
    public string MyStuff {get;set;} 
    . 
    . 
    . 
} 

を持っている場合、それははるかに簡単オブジェクトだとインタラクティブなビューを作成することは、高価な命題であるので、それゆえ、それはうまくいけばはるかに再利用できますので、私は、部分的にはViewModelAにバインドします。

しかし、の投稿のすべてのフォーム情報が必要です。私はViewModelAとViewModelBの両方を取るコントローラのアクションを広げることができ、次にViewModelAプロパティをViewModelBに割り当てるために追加のロジックを実行することができますが、これを行うためのより宣言的な方法がありますか?

私はこのようないくつかの属性を使用して、私はViewModelAにタグを付けることができれば、私は思ったんだけど推測:

[Bind(Prefix = "ViewModelB", Include = "MyStuff")] 

私はアクションレベルでそれを行うことができます知っているが、私はViewModelにレベルでこのロジックを注入することができます?

さらに、RazorがCQRSのアプローチに従うといいでしょう。例えば。レンダリング

Html.TextBoxFor(target => target.Property, model => model.Property2) 

だからその上、テキストボックスはProperty2値で初期化されますが、ポストの上に、それがtarget.Propertyに掲載されます。

答えて

0

ViewModelBを継承できません。ViewModelA

public class ViewModelA : ViewModelB 
{ 
    public string Stuff {get;set;} 
    // etc. 
} 

public class ViewModelB 
{  
    public string MyStuff {get;set;} 
    // etc. 
} 

は、その後、あなたのコントローラの方法では、単に ViewModelB広く、まだすべてをマップする必要が結合モデルを指定します。

[HttpPost] 
public ActionResult(ViewModelB model) 
{ 
    // etc. 
} 
+0

私はそれを知る方法の1つになると思っていましたが、私はクラス継承とIsA関係を一般的に嫌います。また、3つ以上のViewModelがあり、そのうち2つがViewModelBに移動したい場合はどうなりますか?または、ViewModelAに関連性のない「表示」プロパティがいくつかある場合はどうなりますか?相続は彼らが価値があるよりも頭痛です。私はViewModel POCOを保持して、できるだけ疎結合したい。 – Alwyn

+2

クラスの継承を拒否しますか?なぜ.NETを使用していますか? – cadrell0

+1

@ cadrell0クラス継承で1つのViewModelにマップする必要がある2つの異なるビューモデルをどのように扱いますか?そして、ターゲットViewModelを不要なプロパティからきれいに保つにはどうしますか?ヒント:できません。 – Alwyn

0

両方のあなたのモデルは、あなたが相続することにより、またはそのビジネス不動産名を設定することであるヘルパー特性を有することにより、これを達成するかどうか、結合の目的のために同じプロパティ名を持っていた場合、それはより簡単になります。

これは、ViewModelBが特定のプロパティ名を別々に扱い、ビューテンプレートを煩雑にしないことを期待していることをより明確にします。

0

フォーム投稿を処理するアクションのパラメータとしてViewModelBを指定するだけです。例えば

[HttpPost] 
public ActionResult Create(ViewModelB newWidget) { 
    // handle creation of widget... all information on the form pertaining to viewmodelB will be 
    // available in newWidget 
} 

ビューを生成するために使用されたものをモデルに重要ではありません。 ViewModelBのプロパティ名と一致するフォームフィールド名がある限り、Model Binderがそれを処理します。

関連する問題