MVC控制器向視圖傳遞數據包含多個實體類的解決方案有很多,這裡主要針對視圖模型、動態模型以及Tuple三種方法進行一些總結與記錄。 基礎集合A namespace ViewModelStudy.Models{ public class TableA { public int A { get; set ...
MVC控制器向視圖傳遞數據包含多個實體類的解決方案有很多,這裡主要針對視圖模型、動態模型以及Tuple三種方法進行一些總結與記錄。
基礎集合A
namespace ViewModelStudy.Models
{
public class TableA
{
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
}
基礎集合B
namespace ViewModelStudy.Models
{
public class TableB
{
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
}
}
構建分別以TableA,TableB為基礎的集合
public List<TableA> tableA()
{
var table = new List<TableA>()
{
new TableA{A=1,B=2,C=3},
new TableA{A=4,B=5,C=6}
};
return table;
}
public List<TableB> tableB()
{
var table = new List<TableB>()
{
new TableB{X=1,Y=2,Z=3},
new TableB{X=4,Y=5,Z=6}
};
return table;
}
方法一:新建ViewModel向視圖傳遞集合數據
using System.Collections.Generic;
namespace ViewModelStudy.Models
{
public class ViewTable
{
public List<TableA> TableA { get; set; }
public List<TableB> TableB { get; set; }
}
}
控制器代碼:
public ActionResult ViewModel()
{
var ViewTable = new ViewTable()
{
TableA = tableA(),
TableB = tableB()
};
return View(ViewTable);
}
前臺視圖代碼:
@using ViewModelStudy.Models@model ViewTable
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<title>Index</title>
</head>
<body>
<div>
<table class="table1">
<tbody>
@foreach (var item in Model.TableA)
{
<tr>
<td>@item.A</td>
<td>@item.B</td>
<td>@item.C</td>
</tr>
}
</tbody>
</table>
<table class="table2">
<tbody>
@foreach (var item in Model.TableB)
{
<tr>
<td>@item.X</td>
<td>@item.Y</td>
<td>@item.Z</td>
</tr>
}
</tbody>
</table>
</div>
</body>
</html> 方法二:使用dynamic傳遞數據 控制器代碼: public ActionResult ExpandoObject()
{
dynamic table = new ExpandoObject();
table.TableA = tableA();
table.TableB = tableB();
return View(table);
} 前臺視圖代碼: @model dynamic
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<div>
<table class="table1">
<tbody>
@foreach (var item in Model.TableA)
{
<tr>
<td>@item.A</td>
<td>@item.B</td>
<td>@item.C</td>
</tr>
}
</tbody>
</table>
<table class="table2">
<tbody>
@foreach (var item in Model.TableB)
{
<tr>
<td>@item.X</td>
<td>@item.Y</td>
<td>@item.Z</td>
</tr>
}
</tbody>
</table>
</div>
</body>
</html> 方法三:使用Tuple傳遞數據 控制器代碼: public ActionResult Tuple()
{
var table1 = tableA();
var table2 = tableB();
var TupleModel = new Tuple<List<TableA>, List<TableB>>(table1, table2);
return View(TupleModel);
} 前臺視圖代碼: @using ViewModelStudy.Models;
@model Tuple<List<TableA>,List<TableB>>
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<title>Tuple</title>
</head>
<body>
<div>
<table class="table1">
<tbody>
@foreach (var item in Model.Item1)
{
<tr>
<td>@item.A</td>
<td>@item.B</td>
<td>@item.C</td>
</tr>
}
</tbody>
</table>
<h1>xxxxxxxxxxxxxxxxxxx</h1>
<table class="table2">
<tbody>
@foreach (var item in Model.Item2)
{
<tr>
<td>@item.X</td>
<td>@item.Y</td>
<td>@item.Z</td>
</tr>
}
</tbody>
</table>
</div>
</body>
</html> 總結: 使用新建視圖模型優點在於對於較為複雜集合展示數據時,使用強類型能夠較方便找到集合下麵的實體屬性,而缺點在於需要新建實體類,可能有相當一部分人都不喜歡新建實體類。
使用動態類型和新疆視圖模型相比,優勢在於不需要新建實體類,想怎麼命名就怎麼命名,缺點也是由此而來,沒法動態推斷出集合下的實體類屬性,可能對於集合屬性比較複雜的頁面來說單單敲出這些屬性就是一個很大的問題。
Tuple傳遞數據是我比較喜歡的一種方式,你只需要記住該集合中各部分數據的序號即可,而且對於實體類可以動態給出其包含的屬性。