MVC 5 Viewmodel 和多个表
MVC 5 Viewmodel and multiple tables
我刚刚完成了 2 个视图,一个插入视图和一个索引视图,我不得不说,处理多个 table 并不容易。 "insert" 是最简单的,我只需添加 2 个不同的 tables:
[HttpPost]
public ActionResult Index(CustPlayerVM custPlayer)
{
var Cust = new Cust()
{
CustID = custPlayer.CustID,
Color = custPlayer.Color
};
var Player = new Player()
{
PlayerName = custPlayer.PlayerName
};
db.Custs.Add(Cust);
db.Players.Add(Player);
db.SaveChanges();
return View();
}
问题是我在 List<> 和 IEnumberable<> 尝试对视图进行编码时遇到了各种错误。在处理 "foreach" 循环时,要么出现可怕的 "model item passed into the dictionary is of type" 错误,要么在视图中出现空引用。这能奏效真是个奇迹,但我不能告诉你为什么。这就是为什么我首先发布了这个问题。
这是 "view" 的样子:
public ActionResult List()
{
ViewBag.Message = "custPlayer";
//CustPlayerVM vm = new CustPlayerVM();
List<object> vm = new List<object>();
vm.Add(db.Custs.ToList());
vm.Add(db.Players.ToList());
ViewBag.PlayerCnt = db.Players.Count();
return View(vm);
}
注意列表(与注释掉的视图模型相反)。
这是视图:
@model IEnumerable<object> @{
List<viewModelA.Cust> lstCust = Model.ToList()[0] as List<viewModelA.Cust>;
List<viewModelA.Player> lstPlayer = Model.ToList()[1] as List<viewModelA.Player>; }
@Html.ActionLink("Create New", "Create") </p> <table class="table">
<tr>
<th>
@Html.Raw("Color")
</th>
<th>
@Html.Raw("CustID")
</th>
<th>
@Html.Raw("ID")
</th>
<th>
@Html.Raw("Player Name")
</th>
<th>
@Html.Raw("PlayerID")
</th>
</tr>
@for (int i = 0; i < ViewBag.PlayerCnt; i++)
{
<tr>
<td>@lstCust[i].Color</td>
<td> @lstCust[i].CustID</td>
<td> @lstCust[i].ID </td>
<td> @lstPlayer[i].PlayerName </td>
<td> @lstPlayer[i].ID</td>
</tr>
} </table>
我不得不在代码周围包装一个 for 循环,因为每个 table 的 foreach 运行 分别。
将来,您应该如何处理 IEnumerable 与匿名类型?
应该不会这么难吧?
为了改进您的代码,我强烈建议您深入研究 OOP basics 和 .NET 基础知识,包括如何使用集合(Array
、List
、Collection
, IEnumberable
, foreach
).
那么下面的思路就很明显了:
创建一个通用的 ViewModel class,它将表示视图的状态
class PersonViewModel{
public int CustID {get;set;}
public string Color {get;set;}
public string PlayerName {get;set;}
}
使用这个常见的 class 作为您的观点
public ActionResult List()
{
var viewModel = new List<PersonViewModel>();
viewModel.Add(db.Custs.ToArray());
viewModel.Add(db.Players.ToArray());
return View(viewModel);
}
应用您的 PersonViewModel 类型的集合,而不是通用对象类型的列表
@model IEnumerable<PersonViewModel>
<table class="table">
@foreach(var personVM in Model){
<tr>
<td>@personVM.Color</td>
<td>@personVM.CustID</td>
<td>@personVM.PlayerName</td>
</tr>
}
</table>
我刚刚完成了 2 个视图,一个插入视图和一个索引视图,我不得不说,处理多个 table 并不容易。 "insert" 是最简单的,我只需添加 2 个不同的 tables:
[HttpPost]
public ActionResult Index(CustPlayerVM custPlayer)
{
var Cust = new Cust()
{
CustID = custPlayer.CustID,
Color = custPlayer.Color
};
var Player = new Player()
{
PlayerName = custPlayer.PlayerName
};
db.Custs.Add(Cust);
db.Players.Add(Player);
db.SaveChanges();
return View();
}
问题是我在 List<> 和 IEnumberable<> 尝试对视图进行编码时遇到了各种错误。在处理 "foreach" 循环时,要么出现可怕的 "model item passed into the dictionary is of type" 错误,要么在视图中出现空引用。这能奏效真是个奇迹,但我不能告诉你为什么。这就是为什么我首先发布了这个问题。 这是 "view" 的样子:
public ActionResult List()
{
ViewBag.Message = "custPlayer";
//CustPlayerVM vm = new CustPlayerVM();
List<object> vm = new List<object>();
vm.Add(db.Custs.ToList());
vm.Add(db.Players.ToList());
ViewBag.PlayerCnt = db.Players.Count();
return View(vm);
}
注意列表(与注释掉的视图模型相反)。 这是视图:
@model IEnumerable<object> @{
List<viewModelA.Cust> lstCust = Model.ToList()[0] as List<viewModelA.Cust>;
List<viewModelA.Player> lstPlayer = Model.ToList()[1] as List<viewModelA.Player>; }
@Html.ActionLink("Create New", "Create") </p> <table class="table">
<tr>
<th>
@Html.Raw("Color")
</th>
<th>
@Html.Raw("CustID")
</th>
<th>
@Html.Raw("ID")
</th>
<th>
@Html.Raw("Player Name")
</th>
<th>
@Html.Raw("PlayerID")
</th>
</tr>
@for (int i = 0; i < ViewBag.PlayerCnt; i++)
{
<tr>
<td>@lstCust[i].Color</td>
<td> @lstCust[i].CustID</td>
<td> @lstCust[i].ID </td>
<td> @lstPlayer[i].PlayerName </td>
<td> @lstPlayer[i].ID</td>
</tr>
} </table>
我不得不在代码周围包装一个 for 循环,因为每个 table 的 foreach 运行 分别。
将来,您应该如何处理 IEnumerable 与匿名类型? 应该不会这么难吧?
为了改进您的代码,我强烈建议您深入研究 OOP basics 和 .NET 基础知识,包括如何使用集合(Array
、List
、Collection
, IEnumberable
, foreach
).
那么下面的思路就很明显了:
创建一个通用的 ViewModel class,它将表示视图的状态
class PersonViewModel{ public int CustID {get;set;} public string Color {get;set;} public string PlayerName {get;set;} }
使用这个常见的 class 作为您的观点
public ActionResult List() { var viewModel = new List<PersonViewModel>(); viewModel.Add(db.Custs.ToArray()); viewModel.Add(db.Players.ToArray()); return View(viewModel); }
应用您的 PersonViewModel 类型的集合,而不是通用对象类型的列表
@model IEnumerable<PersonViewModel> <table class="table"> @foreach(var personVM in Model){ <tr> <td>@personVM.Color</td> <td>@personVM.CustID</td> <td>@personVM.PlayerName</td> </tr> } </table>