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

问题描述 投票:33回答:4

我正在尝试生成这样的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>

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

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

给定Action代码

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

        return View();
    }

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

asp.net-mvc view
4个回答
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);
}

然后你的视图只是强烈输入到FooBarViewData,你可以使用Model属性调用该对象的成员。


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 );
}

(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)
...
© www.soinside.com 2019 - 2024. All rights reserved.