web-dev-qa-db-ja.com

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

そのような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」の名前を手動で記述したくありません。

35
alex2k8

文字列インデックス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プロパティを使用してそのオブジェクトのメンバーを呼び出すことができます。

42
Wyatt Barnett

いくつかの選択肢があります。まず、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>
11
tvanfosson

上記のソリューションは古くなっている可能性があります。このソリューションは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
0
David Lee

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)
...
0
Abdul G