MVC 5 Viewmodel和多个表

时间:2016-10-13 19:15:37

标签: viewmodel ienumerable multiple-tables asp.net-mvc-5

我刚刚完成了2个视图,一个插入和一个索引视图,我不得不说,处理多个表并不容易。 “插入”是最简单的,我只需添加到2个不同的表:

[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”循环时获得可怕的“传递到字典中的模型项是类型”错误或视图中的空引用。这是一个奇迹,这是有效的,但我不能告诉你为什么。这就是我开始提出这个问题的原因。 以下是“视图”的样子:

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

注意List(与注释掉的viewmodel相对)。 这就是视图:

@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循环,因为foreach分别为每个表运行。

将来,你应该怎么处理IEnumerable和匿名类型? 这不应该是这么难,对吗?

1 个答案:

答案 0 :(得分:0)

为了改进您的代码,我强烈建议您在OOP basics和.NET基础知识中进行更多调查,包括如何使用集合(ArrayListCollection,{ {1}},IEnumberable)。

然后,以下想法将是显而易见的:

  1. 创建一个通用的ViewModel类,它将代表View的状态

    foreach
  2. 将此公共类用于视图

    class PersonViewModel{
       public int CustID {get;set;}
       public string Color {get;set;}
       public string PlayerName {get;set;}
    }
    
  3. 应用PersonViewModel类型

    的集合,而不是通用对象类型列表
    public ActionResult List()
    {
       var viewModel = new List<PersonViewModel>();      
       viewModel.Add(db.Custs.ToArray());
       viewModel.Add(db.Players.ToArray());          
    
       return View(viewModel);
    }