2016-09-26 30 views
1

私は2つの他のモデル含み、以下のViewModelがあります。私のビューはこのようになりますASP.NET MVC:1つのビューで複数のモデルを使用するにはどうすればよいですか?

public class ViewModel 
{ 
    public ViewModel1 viewModel1 { get; set; } 
    public ViewModel2 viewModel2 { get; set; } 
} 

を:

@Html.TextBoxFor(m => m.viewModel1.NameOfCustomer) 
@Html.TextBoxFor(m => m.viewModel2.ProductCategory) 

そして最後にコントローラ:

public ActionResult CreateNewOrder(ViewModel viewModel) 
{ 

    Model1 myModel1 = new Model1() 
    { 
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

    return View(viewModel); 
} 

問題があれば、ありますViewModelから実際のモデルに渡すためにデータを取りたいのですが、動作しません。値としてnullを表示するだけです。私は、コントローラのデータを次のように変更を行う場合があるが、これはそれが必要として動作しません:

public ActionResult CreateNewOrder(ViewModel viewModel) 
{ 
    // that works 
    viewModel.viewModel1.NameOfCustomer = "John John"; 

    Model1 myModel1 = new Model1() 
    { 
    myModel1.NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

    return View(viewModel); 
} 

だから私は問題があると思い、私の見解から私のデータは私のViewModelに正しく送信されていません。私はあなたが間違って何をしているのかをヒントに伝えてくれることを願っています。これが事実であるように@Stephen Mueckeさんのコメント次

よろしく、

+0

「ちょうど値としてnullが表示されています。 viewModelはnullか、モデル自体のプロパティはnullですか? –

+0

異なるViewModelデータを異なるアクションに投稿できます。 '/ vm1'と' ViewModel2'をアクション '/ vm2'に' ViewModel1'データと同じようにします –

+0

タプルを使って複数のモデルをビューに送ることができます。 – Bharat

答えて

0

編集は、鳴りません。しかし、私の最初のコールポートは依然としてリクエスト内のPOSTペイロードをチェックして、期待通りにワイヤを通過していることを確認するので、この回答を残しておきます。この部分は役に立つかもしれません。


MVCアクションに入ってくるデータは本質的に平坦なビューモデルですが、アクションで期待されるモデルは階層的です。

ブラウザの開発ツール内のネットワークタブを見て、POSTリクエストが行われていることを確認し、サーバーに送信されるペイロードを確認します。

これが掲載されているような音:
ViewModel自体はNameOfCustomer性質を持っていないため、ご使用のモデルにサーバー側の自動バインディングされることはありません {"NameOfCustomer": "SomePerson", ....}

- 代わりに、それはで開催された子オブジェクト上だがviewModel1プロパティ。以下は掲載されていたのであれば、自動バインディングは動作します:
{"viewModel1": {"NameOfCustomer" : "SomePerson", ....}}

ソリューションが含まれます:
1)構造を確保することは正しく
2上記のようにネストされたオブジェクトを反映して、自分でJSから投稿するペイロードを構築する)を作成しますそうViewModel1からのすべてのプロパティがViewModelクラス
3でトップレベルで直接保持されている平坦化のviewmodelは、)カスタムモデルバインダー

+2

'@Html.TextBoxFor(m => m.viewModel1.NameOfCustomer)'は、正しくバインドされる 'name =" viewModel1.NameOfCustomer "で入力を生成します。 –

+1

@StephenMuecke - ありがとう、モデルで何か変わっていたようですその地域で縛られているかもしれませんが、そうではないかも – AdaTheDev

0

あなたのコードを作成し、適切コントローラに情報を伝える必要があります(同様のフィドルhereを参照してください)

作品:

Model1 myModel1 = new Model1() 
    { 
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

は、あなたはここに正しいことをやっていますか?タイプ変数Model1を作成し、データベースのOrdersに追加しています。何かエラーがありますか?正しいコードは、次のようなものでなければなりません:

 Order myModel1 = new Order() 
     { 
     NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
     }; 

     db.Orders.Add(myModel1); 
     db.SaveChanges(); 
+0

私が正しく理解している場合、エラーはMVCがアクションパラメータにバインドしていないことで、データベースによって保存されているものではありません。 –

+0

Model1はおそらくそれを命名する最善の方法ではないでしょう、そうです。しかし、その正しいモデルです。私はあなたの質問の残りの部分に答えています。私はここまで家に戻っています。今まで、皆さんの努力のために皆様に感謝したいと思います。本当に感謝しています。 :) – RawMVC

+0

私はちょうど尋ねなければならなかった/仮定する、フィドルのリンクですべてがバインディングで正常に動作するようだから。また、RawMVCは、「コントローラのデータに以下の変更を加えても、データは保存されていないと思っていました。 – avi

関連する問題