MVC中使用Tuple完成匿名类数据存储

使用MVC时,会遇到从Controller传递到View的数据只是某几个表中的几个字段的数据,有很多人都会想到能否把这几个字段组成一个匿名类传到View,但是这样好像行不通,所以有些时候我们会针对这几个字段来创建一个Model,方便数据的正确传递,但是这会使得Model越来越多,很多人都不喜欢这么做,那有没有其他方法解决这个问题呢?

这里给大家介绍一种方法:

使用System.Tuple来实现,该类是一个静态类,提供了一些用于创建元组对象的静态方法,这个就不多了,大家可以自己去查看下元数据就知道了,很简单的。

接下了看下使用方法:

Controller代码:

public ActionResult TupleTest()

 {

    LinqDBEntities db = new LinqDBEntities();

    dynamic data = db.StuInfo.ToList().Select(s => Tuple.Create(s.StuNum, s.StuName, s.StuAge,s.StuSex, s.ClassID));

    ViewData["data"] = data;

    return View();

  }

在Controller中把要传递的数据通过Tuple.Create封装数据

<%

   dynamic dd = ViewData["data"];

   foreach (var item in dd)

   {               

     Response.Write(item.Item1+"-"+item.Item2+"-"+item.Item3+"-"+item.Item4+"-"+item.Item5+"<br>");

    }  

 %>

在View中可以拿到封装的数据。

注意:Tuple.Create最多支持8个参数,但是有时候我们的字段不止8个,我们可以使用Tuple嵌套,例如:

Tuple.Create(s.StuNum, s.StuName, s.StuAge,s.StuSex, s.ClassID,s.StuNum,Tuple.Create(s.StuName,s.StuAge))

但是嵌套以后在,代码的清晰度就会降低,所以建议大家如果字段过多可以考虑创建专门的Model类

 

 有时需要在ASP.Net MVC4的视图的@model中使用多个类型的实例,.NET Framework 4.0版本引入的System.Tuple类可以轻松满足这个需求。

 假设Person和Product是两个类型,如下是控制器代码。

using System;

using System.Web.Mvc;

namespace Razor.Controllers

{

    public class HomeController : Controller

    {

        Razor.Models.Product myProduct = new Models.Product { ProductID = 1, Name = "Book"};

        Razor.Models.Person myPerson = new Models.Person { PersonID = "1", Name = "Jack" };

        public ActionResult Index()

        {

            return View(Tuple.Create(myProduct,myPerson));  // 返回一个Tuple对象,Item1代表Product、Item2代表Person

        }

     }

}

如下是视图Index.cshtml的代码

 @model Tuple<Razor.Models.Product, Razor.Models.Person>

 @{

    Layout = null;

    }

 <!DOCTYPE html>

 <html>

<head>

    <meta name="viewport" content="width=device-width" />

    <title>Index</title>

</head>

<body>

    <div>

        @Model.Item1.Name

    </div>

</body>

</html>

原文地址:https://www.cnblogs.com/lgx5/p/5676405.html