【问题标题】:Pass multiple objects to view through controller通过控制器传递多个对象查看
【发布时间】:2012-03-23 14:28:45
【问题描述】:

我正在开发一个 asp.net mvc web 应用程序,我想通过控制器将 2 个对象发送到视图,现在我只发送一个对象以通过控制器查看

return View(repository.func(id));

在我看来我得到了

<% var data = Model.First %>

但现在我很困惑如何发送 2 个对象以及如何获取它。

【问题讨论】:

  • 两个对象是否属于同一类型?
  • ViewBag/ViewData 是一个选项还是需要通过模型来完成?

标签: c# asp.net asp.net-mvc


【解决方案1】:

(学习)使用 ViewModel 的绝佳机会:

class MyViewModel { ... }


// and in the Action:
var view = new MyViewModel();
view.First = repository.func(id) ;
view.Second  = ....;    
return View(view);

【讨论】:

  • class MyViewModel {...} 在类中我需要定义什么。请详细解释以及如何让每个对象在视图中
  • 是的,你必须写一个 MyViewModel 类。它将成为 View 中的 Model 属性。
【解决方案2】:

您可以使用 ViewBag(我个人不喜欢这种方法)或创建将同时保存两个值并将其用作视图模型的类

【讨论】:

    【解决方案3】:

    我假设您的视图是强类型的,与您返回的任何内容的类型相同:

    repository.func(id)
    

    让我们说对象'Foo'

    假设您使用的是强类型视图:

    @model Foo
    

    您可以将其更改为:

    @model IEnumerable<Foo>
    

    然后,您的视图将被强类型化为 Foo 的集合(IEnumerable)

    在您看来,您可以这样做:

    foreach(var foo in Model)
    {
        //Do stuff
    }
    

    当然,您的存储库方法必须返回一个对象集合(例如通过实现 IEnumerable - List 的东西)

    【讨论】:

      【解决方案4】:

      对 Henk 的回答稍作阐述

      class MyViewModel {
          TMyEntityType1 First { get; set; }
          IQueryable<TMyEntityType2> Second { get; set; }
      }
      

      然后在操作中收集 2 组数据并将其存放在 MyViewModel 的实例中

      var viewModel = new MyViewModel();
      viewModel.First = repository.func(id);
      viewModel.Second  = repository.containing("?");    
      return View(viewModel);
      

      在您看来,您可能希望将其更改为:

      <% var dataFirst = Model.First; 
         var dataSecond = Model.Second;%>
      

      Model 现在是 MyViewModel 类型,而不是 repository.func(id) 的返回类型

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 2020-04-11
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        相关资源
        最近更新 更多