MVC传递Model之TempData、ViewData、ViewBag区别及用途

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

时间: 2024-11-09 03:05:00

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

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

ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别显示老师课程表.学生上课表,如图: 相关的Model: 1 public class Course 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5

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

ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别显示老师课程表.学生上课表,如图: ? 相关的Model: 1 public class Course 2 { 3 public int Id { get; set; } 4 public string Name { get

MyMvc: TempData ViewData ViewBag

TempData: 创建或更新一次,可访问一次,随即销毁(为是剪切不复制): ViewData: 键值对结构: ViewBag: 使用dynamic控制器,封装ViewData: ViewData与ViewBag异同: 同:一般情况下访问的数据是相同的: 异:1.使用语法:ViewData为字典语法,ViewBag类似属性访问: 2.访问范围:ViewBag不可以访问非有效标识符的ViewData键值对(比如Key带空格): 3.作为参数:因ViewBag使用dynamic,其值为动态类型,而编

asp.net mvc ViewData 和 ViewBag区别,TempData

ViewData 和 ViewBag都是页面级别的生命周期,TempData--Passing data between the current and next HTTP requests TempData默认是实现方式--存在session中,所以结论很简单,能不用就不用..要么负载时就麻烦了. Passing data between the current and next HTTP requests - See more at: http://www.rachelappel.com/w

MVC ViewBag和ViewData的区别

在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary).它们的定义如下: public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } 控制器中代码: public ActionResult Index() { Vie

【MVC4 之 ViewData ViewBag TempData】

ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ViewData.Model:由于viewdata在传入的时候属于弱类型,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给view使用之后,还必须通过转型才能进一步使用,不太方便. eg: public ActionResult Index(){ var data=GetD

MVC使用jQuery从视图向控制器传递Model的2种方法

http://blog.csdn.net/make1828/article/details/29846003 using System.ComponentModel.DataAnnotations; namespace MvcApplication1.Models { public class Movie { public int Id { get; set; } [Required(ErrorMessage = "必填")] public string Title { get; se

ASP.NET MVC ViewData/ViewBag 简单小结

近期在项目中遇到一个问题,就是用ViewBag.Model存储匿名对象传递给View,但是需要根据条件给匿名对象添加属性,这个可真心不易,Google了一下发现很多方案都是动态编译神马的,感觉好高大上,最后也没采用,因为不知道动态编译的性能消耗大不大. 最后是自己简单研究了一下,在ViewBag.Model中存储了Dictionary<string, object>,在View通过Model[key]的方式可以正常读取相应的值,在此对ViewData和ViewBag的使用进行一个简单的小结:1

asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 转载自:http://blog.csdn.net/luoyeyu1989/article/details/8275866

首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器.视图.实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话:而C层直接与三层中的BLL进行对话. 所以, .net的三层结构中,并没有action这个概念. asp.net mvc 是微软新发布