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>
    &nbsp;
    @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 基础知识,包括如何使用集合(ArrayListCollection , IEnumberable, foreach).

那么下面的思路就很明显了:

  1. 创建一个通用的 ViewModel class,它将表示视图的状态

    class PersonViewModel{
       public int CustID {get;set;}
       public string Color {get;set;}
       public string PlayerName {get;set;}
    }
    
  2. 使用这个常见的 class 作为您的观点

    public ActionResult List()
    {
       var viewModel = new List<PersonViewModel>();      
       viewModel.Add(db.Custs.ToArray());
       viewModel.Add(db.Players.ToArray());          
    
       return View(viewModel);
    }
    
  3. 应用您的 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>