2009-06-03 19 views
31

ASP.NET MVC - 複数のモデルで表示

これで処理できるようにしています。

 public ActionResult Process(Foo foo, Bar bar) 
    { 
     ... 
    } 

 public ActionResult Edit() 
    { 
     ViewData["foo"] = new Foo { A = "aaa" }; 
     ViewData["bar"] = new Bar { B = "bbb" }; 

     return View(); 
    } 

Edit.aspxで何を書きますか見る?私は 'foo.a'と 'bar.b'という名前を手動で書きたくない。

答えて

39

文字列索引ViewDataが悪いです。おそらく、多変数ビュー・データ用のラッパー・クラスを作成し、それを厳密に型指定されたビューに渡すことです。 IE:

public class FooBarViewData 
{ 
    public Foo Foo {get; set;} 
    public Bar Bar {get; set;} 
} 
public ActionResult Edit() 
{ 
    FooBarViewData fbvd = new FooBarViewData(); 
    fbvd.Foo = new Foo(){ A = "aaa"}; 
    fbvd.Bar = new Bar(){ B = "bbb"}; 
    return View(fbvd); 
} 

次に、あなたのビューは、ちょうど強くFooBarViewDataに入力され、あなたがModelプロパティを使用して、そのオブジェクトのメンバーを呼び出すことができます。

8

あなたにはいくつかの選択肢があります。まず、ViewDataからそれらを参照し、HtmlHelper拡張を使用できます。または、ビュー固有のモデルを作成し、Edit.aspxに強く型付けされたビューページを使用することもできます。

public class EditModel 
{ 
    public Foo foo { get; set; } 
    public Bar bar { get; set; } 
} 

public ActionResult Edit() 
{ 
    var model = new EditModel(); 

    model.foo = new Foo { A = "aaa" }; 
    model.bar = new Bar { B = "bbb" }; 

    return View(model); 
} 

(Edit.aspxタイプViewPage<EditModel>である)

いずれにせよ、HtmlHelperの拡張機能は、任意の初期値をピックアップします。

<form action="/some/process" method="post"> 
    <%= Html.Hidden("foo.A") %> 
    <%= Html.Hidden("bar.B") %> 
</form> 
0

上記の解決策は古くなっている可能性があります。このソリューションは、ASP.Net MVC5 +で動作するようです。

ViewModelメソッドを使用する必要があります。これはあなたがチェックアウトできる優れたチュートリアルです。

http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example

あなたは1 ViewModelに複数のモデルを結合し、あなたがViewModelに使用する各モデルからすべてのプロパティをつかむために持ってしようとしています。

しかし、それは非常にでは、新しいコントローラと、新しく作成されたViewModelを収容するための新しいビューを作成することをお勧めです。チュートリアルを読んでください。

public class FooBarViewModel 
{ 
    public string A {get; set;} //Property for Foo 
    public string B {get; set;} //Property for Bar 
} 

public ActionResult Edit() 
{ 
    FooBarViewModel fooBarVM = new FooBarViewModel(); 
    fooBarVM.A = "aaa"; 
    fooBarVM.B = "bbb"; 

    return View(fooBarVM); 
} 

しかし、この場合には、別のビューにViewModelを渡すことができるはずです。この同様の指令をfoobar.cshtmlページで正しく宣言してください。

@model FooBar.Models.FooBarViewModel 
関連する問題