2011-03-30 71 views
7

目前,我有我的MVC項目的HomeController下面的代碼:MVC - 傳遞多個數據表視圖

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

有沒有辦法有觀點接受兩個模型是這樣,或者,一個方法來合併兩個結果集(兩個表以任何方式不鏈接​​

回答

16

是的,但不是那樣的。做你想做的事情的方法是創建一個自定義的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)" %> 

不要試圖鍵入youself;更容易創建新視圖並檢查「強類型」視圖,並指定新的自定義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

是 - 創建一個新的類 - 你會爲你的模型中使用 - 包含兩個表:

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

然後,在你的控制器,初始化這個類和填充都屬性並將其發送到您的視圖。然後,修改視圖以識別此ne w鍵入視圖模型。

0

在預MVC3我會用一個視圖模型,並添加屬性爲每個對象所需的視圖使用。如果你使用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); 
2

你爲什麼不以你的模型添加一個類呢?

public class MyModel { 

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

} 

然後,您將MyModel傳遞給視圖頭上的視圖。

在控制器:

公共的ActionResult指數() { MyDataContext DC =新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); 
} 
1

你可以讓他們都到一個單一的視圖模型:

模型定義:

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); 
    } 
0

你會可能有使用ViewModel。你定義了一個類,它將包含你想要的兩個類的實例(+任何其他附加屬性),然後你將它用作模型。

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

然後你只需要準備這些視圖模型類和他們的後來訪問實例的集合,如:

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

等..只要合併所有你需要的實體爲一類,並使用這個類作爲你的模型在控制器和視圖中。

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「行」的交易實體列表(TEL1,TEL2,tel3),然後添加三個「電話」對象(如基本表)到我的telCollection並指定要對我的ViewData 。模型。

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(#))迭代,創建三個不同的列,每個塔爾「表」的。順便說一句,你可以忽略計數器變量。

<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> 
相關問題