MVC – 将多个数据表传递给视图

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

public class HomeController : Controller { public ActionResult Index() { MyDataContext dc = new MyDataContext(); IQueryable j = from n in dc.Table1 select n; return View(j); } 

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

 public class HomeController : Controller { public ActionResult Index() { MyDataContext dc = new MyDataContext(); IQueryable j = from n in dc.Table1 select n; IQueryable l = from k in dc.Table2 select k; return View(j, l); } 

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

是的,但不是那样的。 执行您希望执行的操作的方法是创建自定义ViewModel类。 此类( MyPageViewModel )将具有两个(或更多)属性,每个对象一个属性。 在您的视图中,您将使用Model.Table1DataModel.Table2Data访问它们。

自定义ViewModel类 非常简单:

 public class MyPageViewModel { public IQueryable Table1Data { get; set; } public IQueryable 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); } } 

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

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

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

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

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

然后将MyModel传递给View’s Head的视图。

在控制器上:

public ActionResult Index(){MyDataContext dc = new MyDataContext();

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

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

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

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

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

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

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

您可以将它们组合成一个ViewModel:

型号定义:

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

用法(在控制器中):

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

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

您可能必须使用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; 

等等。只需将您需要的所有实体合并到一个类中,并将此类用作Controller和View中的模型。