ASP.NET MVC - 多模型视图

35

我正在尝试生成这样的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'这些名称。

4个回答

43

使用字符串索引的ViewData是不好的。你可能想要做的是为你的多变量视图数据创建一个小包装类,并将其传递给强类型视图。例如:

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 属性调用该对象的成员。


11

你有几种选择。第一,你可以从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

你需要将多个模型合并成一个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

0

我曾经苦苦挣扎地尝试让两个模型协同工作,但是我找到的大部分答案都是针对早期版本的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)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接