そのようなHTMLを生成しようとしています
<form action="/some/process" method="post">
<input type="hidden" name="foo.a" value="aaa"/>
<input type="hidden" name="bar.b" value="bbb"/>
<input type="submit" />
</form>
このアクションで処理できるように:
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」の名前を手動で記述したくありません。
文字列インデックス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
プロパティを使用してそのオブジェクトのメンバーを呼び出すことができます。
いくつかの選択肢があります。まず、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>
上記のソリューションは古くなっている可能性があります。このソリューションはASP.Net MVC5 +で機能するようです。
ViewModel
メソッドを使用する必要があります。これは、あなたがチェックできる優れたチュートリアルです。
http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example
複数のモデルを1つのViewModel
に結合し、使用する各モデルのすべてのプロパティをViewModel
に取り込む必要があります。
[〜#〜] but [〜#〜]、それは[〜#〜]非常に[〜#〜]は、新しいControllerと新しいView新しく作成された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
2つのモデルを機能させるためにしばらく苦労していましたが、出会った答えのほとんどは、MVCの以前のバージョン向けのものでした。
David Leeの提案に従って、次のチュートリアルがMVC 5に最適に機能することを発見しました。
http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example
結合を作成し、両方のモデルから必要な列のみを選択しました。
部分的なビューで作業していた
View.cshtml
@model IEnumerable<Test.Models.TestViewModel>
...
@foreach (var item in Model)
{
<tr>
<td style="text-align:center;vertical-align:middle">
@Html.DisplayFor(modelItem => item.TestName)
...