当前位置 博文首页 > 文章内容

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

    作者: 栏目:未分类 时间:2020-07-10 14:03:13

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



          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传递数据是我比较喜欢的一种方式,你只需要记住该集合中各部分数据的序号即可,而且对于实体类可以动态给出其包含的属性。