ASP.NET MVC - 使用多个模型查看

ale*_*2k8 33 asp.net-mvc view

我正在尝试生成这样的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>
Run Code Online (Sandbox Code Playgroud)

所以它可以被这个Action处理:

    public ActionResult Process(Foo foo, Bar bar)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

给定Action代码

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

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我应该在Edit.aspx视图中写什么?我不想手动写名字'foo.a'和'bar.b'.

Wya*_*ett 40

字符串索引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);
}
Run Code Online (Sandbox Code Playgroud)

然后您的视图只是强类型FooBarViewData,您可以使用该Model属性调用该对象的成员.


tva*_*son 10

你有几个选择.首先,您可以从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 );
}
Run Code Online (Sandbox Code Playgroud)

(Edit.aspx属于类型ViewPage<EditModel>)

无论哪种方式,HtmlHelper扩展都会获取任何初始值.

<form action="/some/process" method="post">
     <%= Html.Hidden( "foo.A" ) %>
     <%= Html.Hidden( "bar.B" ) %>
</form>
Run Code Online (Sandbox Code Playgroud)