ViewData,ViewBag和TempdData的区别

在asp.net mvc程序设计中,传递数据常常会用到viewdata、viewbag、tempdata,这3个对象都可以用来传递数据,但他们在细节中有很多的不同之处。
ViewData:ViewData是一个字典集合,通过key值读取对应的value使用方法:ViewData["myname"]="张三"
ViewBag:是动态类型,作用和ViewData一样,都是用来存储信息,有一些不同的是ViewData是object类型,ViewBag是动态类型,从运行效率上来讲,ViewBag 高于ViewData。在实际开发中,通不只用其中一种。使用方法:ViewBag.data="张三"
TempData:跨请求数据传递,它的机制类似于Session对象,不同的页面之间可以传递参数,但TempData只保存上一次的数据,当页面再次刷新,数据消失。使用方法:TempData["myname"]="张三"


区别总结
  1. ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] = MyName
  2. ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName = MyName
  3. ViewBag和ViewData只在当前Action中有效,等同于View
  4. TempData可以通过转向继续使用,因为它的值保存在Session中。但TempData只能经过一次传递,之后会被系统自动清除
  5. ViewData和ViewBag 中的值可以互相访问,因为ViewBag的实现中包含了ViewData


ViewBag & ViewData 的例子:
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
}

在视图中:

@ViewBag.Name 
@ViewData["Name"]

 

最后一个是TempData  机制就是Session,字典类型等键值方式,键一般为string类型,值可以是object类型。这种方式,是把数据存储在客户端的cookie里,可以保存较长的一段时间。也需要进行行验证,但是没有安全保障。关于ViewData 和viewbag你需要在程序中较灵活的应运。因为每一个页面的动作都贯穿asp.net 整个生命周期。你可以在子页面中使用viewdata/viewbag,但是要细心,你是不是用它来填充无关的数据,会污染你的控制器。

public ActionResult ProduceOutput() {
        TempData["Message"] = "Warning message from Derived Controller.";
        return Redirect("/Home/Index");
    }

 

在 Views/Home 目录下的 Index.cshtml 中,取 TempData 中的数据如下:

...
@TempData["Message"]

一般在当前 View 中使用 ViewBag 或 ViewData,在两个请求之间传递临时数据用 TempData。由于 TempData 被使用后即被释放,所以如果要二次使用 TempData 中的数据就需要将其存到其他变量中。

 

posted @ 2017-07-28 10:29  刘家小生  阅读(497)  评论(0编辑  收藏  举报