MVC使用过程中常常会用到TempData、ViewData、ViewBag三种方式,这三种什么差别呢?

TempData:默认存储于Session中,可通过继承ITempDataProvider接口改变。

生命周期:经过一次Controller传递就失效,即View读取一次后相应的TempData即从TempData集合中删除,只是假设TempData未被View读取之前,其值可在Controller之间传递。PS:假设你不想TempData使用后就删除,您能够通过TempData.Peek(“KEY”)来长期保存。假设是仅仅想再保存一次,再读取一次后再删除则要使用TempData.Keep(“KEY”),这样假设再被读取又会再次标记删除。

ViewData:默认存储为Dictionary键值对

生命周期:仅对当前View有效。

ViewBag:不再是以键值对形式存放。它以dynamic类型存放

生命周期:同ViewData一样,仅对当前View有效

PS:ViewBag可看成是对ViewData的封装,只是ViewBag不能够作为扩展方法的參数,由于扩展方法的參数类型必须明白

除了以上三种方式以外,还有ViewModel、PartialView和Tuple

ViewModel:它是基于视图需求的Model,它能够把多个View Model以属性的方式合并到一个View Model中。

长处:

● 把多个model放到一个View Model中

● 有智能提示

● 安全性:Domain Model被隐藏

● 当Domain Model有变化,不须要改动视图非常多。仅仅须要改动相应的View Model就能够

● 在Domain Model和View之间实现了松耦合

PartialView:对于哪些须要反复使用的视图部分,提取出来作为部分视图。

长处:

● 方便反复使用

● 仅仅更新主视图的某个部分

缺点:

● 多过的使用影响可读性

Tuple:.NET 4.0推出的。是一个有序的、不可变的、固定大小的、同意存放多种类型的类。

适合传递一些”小数据”。假设不想在ASP.NET MVC中创建View Model,可用Tuple来替代。

长处:

● 提供了一种不须要创建View Model而传递Model的方式。

缺点:

● 大小被限制:最多仅仅能存放8组数据。

● 值以item1, item2…来传递。非常难确定item1, item2…究竟代表哪组数据。

● 智能提示不理想

样例:

□ HomeController

        public ActionResult TupleDemo()
{
var allModels = new Tuple<List<Course>, List<Teacher>, List<Student>>(_repository.GetCourses(),
_repository.GetTeachers(), _repository.GetStudents()) {};
return View(allModels);
}

□ Home/TupleDemo.cshtml

@model Tuple <List <MvcApplication1.Models.Course>, List <MvcApplication1.Models.Teacher>, List <MvcApplication1.Models.Student>>    

下拉框遍历课程:

@foreach (var course in Model.Item1)

ajax请求老师课程表和学生上课表:

@Html.Raw(Json.Encode(Model.Item2))
@Html.Raw(Json.Encode(Model.Item3))

● 假设传递的是”小数据”,我们想到ViewBag, ViewData

● 当须要跨controller,跨action传递。我们想到TempData

● 假设基于View的Model,我们想到针对该View设计View Model

● 假设视图的某个部分须要被反复使用,就把之提炼出来。成为一个Partial View

● 假设传递的是”小数据”。又不想使用View Model,能够考虑Tuple

MVC传递Model之TempData、ViewData、ViewBag差别及用途的更多相关文章

  1. ASP.NET MVC传递Model到视图的多种方式总结

    ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...

  2. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

  3. ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别

    在ASP.NET MVC中,视图数据可以通过ViewBag.ViewData.TempData来访问,其中ViewBag 是动态类型(Dynamic),ViewData 是一个字典型的(Diction ...

  4. ASP.NET MVC传递Model到视图的多种方式总结(一)__通用方式的使用

    有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别 ...

  5. MVC传递Model

    @using System.Configuration;@using System.Text.RegularExpressions;@model Model.NewInfo  // 指定Module的 ...

  6. MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍

    在"MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple"中,体验了使用不同的方式传递多 ...

  7. MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple

    从控制器传递多个Model到视图,可以通过ViewData, ViewBag, PartialView, TempData, ViewModel,Tuple等,本篇逐一体验.本篇源码在github. ...

  8. MVC ,Action方法传数据给视图有几种方式?--PS:tempData和Viewbag,还有ViewData之间的区别

    //---------------------------------控制器向视图传递数据 public ActionResult TransData() { //1.ViewBag ViewBag. ...

  9. 【MVC4 之 ViewData ViewBag TempData】

    ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. V ...

随机推荐

  1. skip index scan

    官网对skip index scan的解释: Index skip scans improve index scans by nonprefix columns since it is often f ...

  2. “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法

    最近在项目中,使用EF编程时,在使用泛型类型的过程中,写了一上午,结果生成时,编译不通过,报出如下错误: “T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法.如图: 找了好久,终 ...

  3. Maven构建灵活配置文件

    本文解决以下问题: Maven下面启动Main函数: 配置JDK版本 如何配置文件,在开发部署测试各个不同版本间无缝切换配置文件: 启动Main函数 Maven默认是不支持Main函数程序,需要在po ...

  4. iOS oc 中的闭包

    //闭包 NSString* s =@"123"; void (^block)() = ^() { NSLog(@"%@",s); }; block();// ...

  5. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  6. 为什么 API 监控对于任何业务来说都重要?

    对于商务运算来说一个比较稳定的趋势在于对 API 日渐增长的依赖性,几乎每一个代码级交互过程都会调用 API 来收集数据或触发某些关键过程.没有 API ,你将无法与同伴进行文件交流,没有 API , ...

  7. tornado异步请求非阻塞

    前言也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了 比如最近发现一个事情:某网 前言 也许有同学很迷惑:tornado不是标榜异 ...

  8. [转贴]JAVA:RESTLET开发实例(二)使用Component、Application的REST服务

    上一篇文章,我们介绍了基于JAX-RS的REST服务,本篇文章我们介绍不基于JAX-RS的模式.JAX-RS其实就是一个简单的 Application服务.和我们接下来介绍的Application基本 ...

  9. Mono for Android 优势与劣势

    原文:Mono for Android 优势与劣势 最近有兴趣了解一下Mono for Andriod,也就是使用.NET平台来开发Andriod程序.Mono for Android API 几乎映 ...

  10. 运行所选代码生成器时出错:无效指针(异常来自HRESULT:0x80004003(E_POINTER))

    这个是在使用了VS2015 update1学MVC的时候,在controllers的方法添加view时报的一个错误,中文基本搜不到解决方法,然后无奈转到成英文,还好G家的搜索提示补全能力拯救了我的渣英 ...