【问题标题】:ASP.NET MVC - View with multiple modelsASP.NET MVC - 使用多个模型查看
【发布时间】:2010-10-30 23:15:11
【问题描述】:

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

给定动作代码

    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


    【解决方案1】:

    字符串索引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 属性调用该对象的成员。

    【讨论】:

      【解决方案2】:

      你有几个选择。首先,您可以从 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&lt;EditModel&gt;

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

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

      【讨论】:

        【解决方案3】:

        上述解决方案可能已过时。此解决方案似乎适用于 ASP.Net MVC5+。

        您将不得不使用ViewModel 方法。这是一个很棒的教程,你可以看看。

        http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example

        您将不得不将多个模型合并为一个ViewModel,并将每个模型的所有属性都抓取到ViewModel 中。

        但是强烈建议您创建一个新的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
        

        【讨论】:

          【解决方案4】:

          我为让两个模型工作而苦苦挣扎了一段时间,而我遇到的大多数答案都是针对早期版本的 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)
          ...
          

          【讨论】:

            猜你喜欢
            • 2015-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多