ViewBag、ViewData和TempData使用方法、区别与联系

一、区别与联系

  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="">>@p.Name;</div>
}

@foreach (var p in ViewData["PList"] as List<MVC_AjaxTest.Controllers.Person>)  //而用ViewData读取的话要用as运算符转换为强类型数据
{
    <div style="">>@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。

时间: 2024-10-25 19:27:28

ViewBag、ViewData和TempData使用方法、区别与联系的相关文章

MVC3中 ViewBag、ViewData和TempData的使用和区别

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

MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)

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

ASP.NET MVC4中ViewBag、ViewData和TempData的使用和区别

一.说明 本文章主要是讲解asp.net mvc中ViewBag.ViewData和TempData的使用和区别,ViewBag.ViewData和TempData常常用于将action方法中的数据传递到view界面. 从MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary). 二.区别 ViewBag 不再是字典的键

ViewBag、ViewData和TempData的使用和区别

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

Mvc中ViewBag、ViewData、TempData如何使用

对于我初学者来说,Mvc有很多都是我所迷惑的,也是我了解后所痴迷的.废话不多说,来谈谈我今天对Mvc这几个常用的对象的理解吧,这里面只简明概要叙述 ViewBag 获取动态视图数据字典 作用:给视图传递数据,不需要转换类型,由系统动态解析,比ViewData执行性能要差 ViewData   获取或设置视图数据的字典         给视图传递数据,需要转换成相应的类型,编写没有ViewBag方便,可读性强 TempData     临时数据的字典   给控制器或视图传递数据,需要和ViewDa

servlet中的HttpServletRequest,HttpServletResponse对象以及service 和 doXX方法区别

一:HttpServletRequest对象作用是用于获取请求数据. 核心的API: 请求行: request.getMethod(); 请求方式 request.getRequetURI() / request.getRequetURL() 请求资源 request.getProtocol() 请求http协议版本 请求头: request.getHeader("名称") 根据请求头获取请求值 request.getHeaderNames() 获取所有的请求头名称 实体内容: req

java 学习之List 的 add 与set方法区别

/** * 在List集合中众多方法中,add(int index,Object obj)方法与set(int index,Object e)方法不易区分 * ,通过下面实例,可以看出两个方法中的区别 */ package gao; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class CollectionDemo { public static void main(

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

在JavaScript中通常使用”."运算符来存取对象的属性的值.或者使用[]作为一个关联数组来存取对象的属性.但是这两种方式有什么区别了? 例如,读取object中的property属性值:  object.property object['property'] 以上两种方式都可以实现属性的存取. 1.语法方面的区别 点表示法的对象的属性名是标识符,而后者的属性名则是一个字符串. 2.灵活性方面的区别 在JavaScript编写程序中,可以为对象创建任意数目的属性.但使用”.“运算符来存取一个

GET与POST方法区别

FORM中的get post方法区别Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法.二者主要区别如下: 1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据. 2. Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用 “&”连接:Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL. 3.