【问题标题】:MVC - Passing multiple data tables to a viewMVC - 将多个数据表传递给视图
【发布时间】:2011-07-26 04:37:39
【问题描述】:

我目前在我的 MVC 项目的 HomeController 中有以下代码:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        return View(j);
    }

这样可以,但现在我想将第二个表传递给同一个视图。所以我在想我应该能够做这样的事情:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        IQueryable<Table2Data> l =
            from k in dc.Table2        
            select k;

        return View(j, l);
    }

有没有办法让视图接受两个这样的模型,或者合并两个结果集(这两个表没有以任何方式链接?

【问题讨论】:

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


    【解决方案1】:

    我通过创建“表”列表并将其传递给我的视图模型解决了这个问题。这本质上是一个 TransactionEntities 列表的列表。仅供参考,我的解决方案名为 DAL,在模型中我创建了一个 TransactionEntity 来表示交易。

        private TransactionEntity te;
        private IEnumerable<TransactionEntity> tel1; // A list of TransactionEntities
        private IEnumerable<TransactionEntity> tel2;
        private IEnumerable<TransactionEntity> tel3;
        private IEnumerable<IEnumerable<TransactionEntity>> telCollection;
    

    我用我的 te 'rows' 填充事务实体列表(tel1、tel2、tel3),然后将三个 'tel' 对象(本质上像一个表)添加到我的 telCollection 并将其分配给我的 ViewData.Model。

        telCollection = new List<IEnumerable<TransactionEntity>>();
        telCollection = telCollection.Concat(new[] { tel1 });
        telCollection = telCollection.Concat(new[] { tel2 });
        telCollection = telCollection.Concat(new[] { tel3 });
        ViewData.Model = telCollection;
        return View();
    

    然后,在 ASPX 文件中,我获取列表并遍历每个“表”(ElementAt(#)),创建三个不同的列,每个列对应于 tal“表”。顺便说一句,您可以忽略计数器变量。

    <td>
       <% int counter = 0; %>
       <% IEnumerable<IEnumerable<DAL.Models.TransactionEntity>> tranlist = 
              (IEnumerable<IEnumerable<DAL.Models.TransactionEntity>>)ViewData.Model; %>
    
       <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(0))
          {.... create rows/columns as needed for the data in a HTML sub-table ......} %>
     </td>
     <td>
        <% counter = 0; %>
        <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(1))
          {..........} %>
     </td>
     <td>
        <% counter = 0; %>
        <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(2))
          {..........} %>
     </td>
    

    【讨论】:

      【解决方案2】:

      是的,但不完全是这样。做你想做的事的方法是创建一个自定义 ViewModel 类。此类 (MyPageViewModel) 将具有两个(或多个)属性,每个对象一个。在您看来,您可以使用Model.Table1DataModel.Table2Data 访问它们。

      自定义 ViewModel 类非常简单:

      public class MyPageViewModel
      {
         public IQueryable<Table1Data> Table1Data { get; set; }
         public IQueryable<Table2Data> Table2Data { get; set; }
      }
      

      视图需要强类型化到这个自定义 ViewModel 类。

      <%@ Page Title="MyPage" MasterPageFile="~/Application/Master Pages/Site.Master"
          Inherits="System.Web.Mvc.ViewPage(Of MyAppNamespace.MyPageViewModel)" %>
      

      不要尝试自己输入;更容易创建新视图并检查“强类型”视图,并指定您的 New Custom Viewmodel 类。

      那么您的 动作控制器方法将是:

      public class HomeController : Controller
      {
        public ActionResult Index()
        {
          MyDataContext dc = new MyDataContext();
      
          MyPageViewModel vm = new MyPageViewModel();
      
          vm.Table1Data =  from n in dc.Table1                     
                           select n;
      
          vm.Table1Data = from k in dc.Table2        
                          select k;
      
          return View(vm);
        }
      }
      

      【讨论】:

        【解决方案3】:

        您可能必须使用 ViewModel。您定义类,它将包含您想要的两个类的实例(+任何其他附加属性),然后将其用作模型。

        class NewViewModel {
            Table1 T1 {get;set;}
            Table2 T2 {get;set;}
            int Anything {get;set;}
        }
        

        然后您只需准备这些 ViewModel 类的集合,然后访问它们的实例,例如:

        NewViewModel m = new NewViewModel();
        var a = m.T1.PropertyA;
        var b = m.T2.PropertyB;
        

        等等。只需将您需要的所有实体合并到一个类中,并将该类用作控制器和视图中的模型。

        【讨论】:

          【解决方案4】:

          你可以把它们都变成一个 ViewModel:

          模型定义:

          public class YourModelName
          {
                 public IQueryable<Table1Data> FirstTableData { get; set;}
                 public IQueryable<Table2Data> SecondTableData { get; set;}
          
                 public YourModelName(IQueryable<Table1Data> d1, IQueryable<Table2Data> d2)
                 {
                      this.FirstTableData = d1;
                      this.SecondTableData = d2;
                 }
          }
          

          用法(在控制器中):

          public ActionResult Index()
              {
                  MyDataContext dc = new MyDataContext();
          
                  IQueryable<Table1Data> j =
                      from n in dc.Table1                     
                      select n;
          
                  IQueryable<Table2Data> l =
                      from k in dc.Table2        
                      select k;
          
                   YourModelName model = new  YourModelName(j, l);
          
                  return View(model);
              }
          

          【讨论】:

            【解决方案5】:

            你为什么不在你的模型中为此添加一个类?

            public class MyModel {
            
            public j {get; set;}
            public l {get; set;}
            
            }
            

            然后你将 MyModel 传递给视图头部的视图。

            在控制器上:

            公共行动结果索引() { MyDataContext dc = new MyDataContext();

                IQueryable<Table1Data> j =
                    from n in dc.Table1                     
                    select n;
            
                IQueryable<Table2Data> l =
                    from k in dc.Table2        
                    select k;
            
                MyModel myclass = new MyModel();
                myclass.j = j;
                myclass.l = l;
            
                return View(myclass);
            }
            

            【讨论】:

              【解决方案6】:

              在 MVC3 之前的版本中,我会使用 ViewModel 并为您希望视图使用的每个对象添加属性。如果您使用的是 MVC3,我会看看 ViewBag

              一个简单的视图模型:

              public class SomeViewModel
              {
                 public object Object1 { get; set; }
                 public string Message { get; set; }
              }
              

              然后在您的控制器中,您将其传递给您的视图:

              var vm = new SomeViewModel { Object1 = coolThing, Message = neatMessage };
              return View(vm);
              

              【讨论】:

                【解决方案7】:

                是的 - 创建一个新类 - 您将用作模型 - 包含两个表:

                public class MyModel {
                   public IQueryable<Table1Data> Table1Data { get; set; }
                   public IQueryable<Table2Data> Table2Data { get; set; }
                }
                

                然后,在您的控制器中,初始化此类并填充两个属性并将其发送到您的视图。然后,修改视图以将这种新类型识别为视图模型。

                【讨论】:

                  猜你喜欢
                  • 2018-12-08
                  • 2011-01-13
                  • 1970-01-01
                  • 2011-06-16
                  • 1970-01-01
                  • 2014-09-14
                  • 1970-01-01
                  • 2014-03-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多