2011-08-11 12 views
2

私はviewmodelを持っていて、他のモデルクラスとは接続していないものがネストされたクラスを持っています。このネストされたクラス(ClassX)で必要なデータを塗りつぶして表示することはできますが、ポストアクションではネストされたクラス(MyViewModelを介して)から別のパラメータとしてポストアクションでデータを取得することはできません。元のビューモデル(MyViewModel)に表示されますが、その属性はnull/0です。ASP.NET MVC 3モデルとビューモデルクラス

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     classX = new ClassX(); 
    } 

    public ClassX classX; 
    public int attrA {get;set;} 
    ... 
} 
public class ClassX {} 

// 
// POST: /MyModel/Create 
public ActionResult Create(MyViewModel myvm, **ClassX cx**, FormCollection collection) 
{} 

私の質問:ネストされたクラスからviewmodelクラスを介してデータを読み取ることはできますか?

+2

ちょうど推測 - 私は変換プロセスがプロパティを引き継ぐと思います。私は "public ClassX classX"を変更する必要があると思います。 "public ClassX classX {get; set;}" –

+0

ありがとうございます。私はあなたの提案を試み、それは働いた。 – sada

答えて

0

http://goneale.com/2009/07/27/updating-multiple-child-objects-and-or-collections-in-asp-net-mvc-views/が、これは私が正しくあなたの質問を理解している場合、あなたはアクションメソッドのあなたのClassX cxパラメータにBindAttribute.Prefixを必要とするあなたのための

MyViewModel myViewModel= new MyViewModel(); 
    UpdateModel(myViewModel, "MyViewModel"); 
    myViewModel.myViewModel= new myViewModel(); 
    UpdateModel(myViewModel.classX, "User.classX"); 
+0

ありがとうございます。私はその記事を読むでしょう。 – sada

0

良い記事です。このようにして、モデルバインダーは値を正しくバインドします。 Bind.Prefixの値はあなたの例では、MyViewModelでClassXプロパティの名前である必要があり、文字列 - クライアント側では、フォームを送信する際に、その値がサーバーに送信されます - "classX"

// 
// POST: /MyModel/Create 
public ActionResult Create(MyViewModel myvm, [Bind(Prefix = "classX")]ClassX cx, FormCollection collection) 
{} 

アイデアは、次のですこのように

attrA=someValue 
classX.SomeProperty=someValue 
classX.SomeOtherProperty=someOtherValue 

アクションパラメータに渡されると、この名前=値ストリングのペアはオブジェクトに変換されます。等価の左側の名前はプロパティ名MyViewModelに一致し、ClassXパラメータは空のままです。しかし、Prefix = "classX"を指定すると、ModelバインダーはClassXのプロパティ名と等価の左のドットの後ろに一致します。

+0

あなたの答えをありがとう。 – sada