8

我目前在我的 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);
    }

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

4

7 回答 7

17

是的,有,但不完全一样。做你想做的事的方法是创建一个自定义 ViewModel 类。此类 ( MyPageViewModel ) 将具有两个(或多个)属性,一个用于您的每个对象。在您看来,您可以使用Model.Table1Data和访问它们Model.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)" %>

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

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

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);
  }
}
于 2011-03-30T15:24:30.087 回答
3

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

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

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

于 2011-03-30T15:24:26.647 回答
2

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

public class MyModel {

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

}

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

在控制器上:

公共 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;

    MyModel myclass = new MyModel();
    myclass.j = j;
    myclass.l = l;

    return View(myclass);
}
于 2011-03-30T15:25:13.307 回答
2

我通过创建一个“表”列表并将其传递给我的视图模型解决了这个问题。这本质上是一个 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>
于 2012-01-16T22:18:35.427 回答
1

你可以把它们都变成一个 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);
    }
于 2011-03-30T15:26:28.277 回答
0

在 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);
于 2011-03-30T15:24:39.253 回答
0

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

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

于 2011-03-30T15:26:34.353 回答