一、区别与联系

  ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同;保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删除。因此TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。

  ViewData与ViewBag使用的是同一个数据源,因此数据一样,只是ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型(http://www.cnblogs.com/kissdodog/archive/2013/01/20/2868644.html),它会在程序运行的时候动态解析。但是只有当访问的关键字是一个有效的C#标识符时,ViewBag才起作用。例如ViewData["have space"]用ViewBag是无法访问的。ViewData[]传递的key/value,value是Object数据类型,传递到View层之后要用as运算转换一下才能够变为强类型数据,但是ViewBag是在运行时才确定数据类型,因此根本不用转换。此处的不用转换类型是所有的类型,例如能够随意传递DateTime,String,其他自定义类型等等。但是就效率而言,ViewData[]稍高。

  例如:

        public ActionResult Index(){ViewData["Name"] = "李四";ViewBag.Name = "张三";return View();}

  @ViewData["Name"];  //输出张三@ViewBag.Name;     //输出张三

二、使用ViewData或ViewBag传递强类型数据

  Controller代码:

        public ActionResult Index(){var PeopleList = new List<People_Model>();for (int i = 0; i < 10; i++){People_Model p = new People_Model();p.Id = i;p.Name = "我是" + i;p.Age = 20 + i;PeopleList.Add(p);}ViewData["list"] = PeopleList;return View();}

    public class People_Model{public int Id { get; set; }
     public string Name { get; set; }
     public int Age { get; set; }}

<table><tr><td>编号</td><td>姓名</td><td>年龄</td></tr>
@foreach(People_Model item in (ViewData["list"] as IEnumerable<People_Model>))
{ <tr><td>@item.Id</td><td>@item.Name</td><td>@item.Age</td></tr>
}
</table>

  以上代码再来改写一下,以说明ViewData与ViewBag的区别,ViewBag是个好东西。先放入一个公共类代码:

    public class Person{public Person(int id, int age, string name){this.Id = id;this.Age = age;this.Name = name;}public int Id { get; set; }
     public int Age { get; set; }
     public string Name { get; set; }}

  控制器代码:  由于ViewBag与ViewData使用的是同一个数据源,因此控制器就使用ViewData传递数据,但是在视图里用不同的东西获取。

         public ActionResult Index(){Person p1 = new Person(1, 20, "张飞");Person p2 = new Person(2, 21, "关羽");Person p3 = new Person(3, 22, "刘备");List<Person> PersonList = new List<Person>();PersonList.Add(p1);PersonList.Add(p2);PersonList.Add(p3);ViewData["PList"] = PersonList;return View();}

  视图代码:

@foreach (var p in ViewBag.PList)    //应该注意到此行代码,根本不用转换数据类型
{<div style="background-color:red">@p.Name;</div>
}@foreach (var p in ViewData["PList"] as List<MVC_AjaxTest.Controllers.Person>)  //而用ViewData读取的话要用as运算符转换为强类型数据
{<div style="background-color:red">@p.Name;</div>
}

三、TempData使用

  下面用TempData来实现一个当提交表单时弹出提示,非表单提交不弹出提示的示例:

  Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace MvcApplication1.Controllers
{public class HomeController : Controller{[HttpGet]public ActionResult Index(){return View();}[HttpPost]public ActionResult Index(string name){TempData["Tips"] = "表单提交成功!";return View();}}
}

  视图:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>Index</title><script src="/Scripts/jquery-1.4.1.js" type="text/javascript"></script><script type="text/javascript">$(function() {<% if(TempData["Tips"] != null) %> <% { %>alert('<%= TempData["Tips"]%>');<% } %>})</script></head>
<body><div><form action="/Home/Index" method="post"><input type="text" name="name" value="测试js" /><input type="submit" /></form></div>
</body>
</html>

  不知道大家是否有遇到过,提交了表单之后,老是不知道如何获取提交成功的提示。实际上,一个普通的表单提交,还真的比较适合页面提交。如果你出于其他原因觉得不适合使用AJAX的情况下,使用TempData的方式适合于不需要跳转的情况,提交后直接可以在本页面继续操作的情况。

  TempData内部是将数据保存在Session里面的,至于实现了哪些接口,不说,因为知道了也没办法实现自定义的TempData。

ViewBag、ViewData和TempData使用方法、区别与联系相关推荐

  1. ASP.NET MVC 3中ViewBag, ViewData和 TempData

    ViewBag, ViewData十分类似,都可用于把数据从controller传递到view. ViewBag是WebViewPage中的一个属性,它的类型是dynamic.dynamic类型可以理 ...

  2. VIewBag/ViewData/Session/TempData

    在ASP.NET.MVC中,页面间和controller与View之间主要有以下几种小量数据传值方式,viewData,ViewBag,TempData,Session变量,这是微软提供给我们提供的多 ...

  3. 浅析对象访问属性的.和[]方法区别

    原文链接:http://www.cnblogs.com/bigboyLin/p/4967820.html 简明版:请问js对象属性值为什么用数组也可以访问 在JavaScript中通常使用" ...

  4. 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别

    一.append()和extend()方法都是用来添加数据到list末尾的,两者的区别: append()添加的时候会把添加的数据当成一个整体进行添加,允许添加任意类型的数据 extend()添加的时 ...

  5. JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)

    为什么80%的码农都做不了架构师?>>>    理解$.extend(),与$.fn.extend()方法区别 1.$.extend()方法 $.extend()方法在JQuery中 ...

  6. java中File类中list()和listFiles()方法区别

    list()和listFiles()方法区别: 1.返回值类型不同:前者为String数组,后者为File对象数组 2.数组中元素内容不同:前者为string类型的[文件名](包含后缀名),后者为Fi ...

  7. 5.12 QR分解的阻尼倒数法和正则化方法区别

    5.12 QR分解的阻尼倒数法和正则化方法区别 基于QR分解的阻尼倒数法目的是改善矩阵 AAA 的病态,正则化方法目的也是改善矩阵 AAA 的病态.区别是阻尼倒数法能获得稀疏解,即最优解分量趋近 00 ...

  8. JAVAAPI学习之Calendar类;Calendar类set()、add()、roll()方法区别

    JAVAAPI学习之Calendar类 http://blog.csdn.net/myjlvzlp/article/details/8065775(写的很好,清晰易懂) Calendar类set(). ...

  9. Android之getCacheDir()和getFilesDir()方法区别

    getCacheDir()和getFilesDir()方法区别. Activity提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/ ...

最新文章

  1. C ++ 11引入了标准化的内存模型。这是什么意思?它将如何影响C ++编程?
  2. 图像处理与计算机视觉资源汇总——论文+代码+教材+视频等等
  3. 移动网页设计9大原则——第1部分
  4. dat文件打开乱码_5.2 实战1:解决在Linux下打开Windows汉字文本的乱码问题
  5. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)
  6. Vector Packet Processing(VPP) (一)简介
  7. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
  8. LA 3263 That Nice Euler Circuit (2D Geometry)
  9. Java Applet 授权命令
  10. 赶在 2018 年前推荐 30 个最火爆的开源库
  11. 第十五章:使用SpringBoot validator让数据更真实
  12. 蓝桥杯 ALGO-100 算法训练 整除问题
  13. surface simplification using quadratic error metrics
  14. linux 生成bmp,linux下生成bmp图片的测试程序
  15. 《离散数学》-图论6.10
  16. build lavas 失败_vue lavas的项目在IE下显示空白
  17. 【redis客户端登录】
  18. 百度 bos php,百度BOS云存储上传插件 - 支持客户端直传、服务端中转、分片上传 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  19. 电脑各种故障排除集锦
  20. absolute位置用法html,html/css中相对定位relative和绝对定位absolute的用法

热门文章

  1. 都是推荐系统,广告算法和推荐算法有啥区别?
  2. 面经:什么是Transformer位置编码?
  3. 解读:为什么要做特征归一化/标准化?
  4. 【廖雪峰python入门笔记】列表生成式
  5. 医学顶刊BMJ打脸谷歌:AI取代医生检测乳腺癌还远着呢
  6. 5分钟!用Java实现目标检测 | PyTorch
  7. 机器人造iPhone,苹果奋斗八年,还是败给了富士康工人
  8. 浅谈lambda表达式最通俗易懂的讲解
  9. 为啥程序员下班后只关显示器从不关电脑?看看各大网站的答案~
  10. Python3.5源码分析-Dict概述