打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MVC控制器传递多个实体类集合到视图的方案总结

      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传递数据是我比较喜欢的一种方式,你只需要记住该集合中各部分数据的序号即可,而且对于实体类可以动态给出其包含的属性。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
成功mvc控制器向视图传递实体类的3种方法1
几条常用的sql查询语句
SQL语句的常用语法
Android 数据库升级解决方案
MySQL的共享锁阻塞会话案例浅析
[Dapper].NET/C#程序开发中使用Dapper如何分别获取查询结果中的多个数据集? | 图享网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服