在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"]="张三"
区别总结
- ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] = MyName
- ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName = MyName
- ViewBag和ViewData只在当前Action中有效,等同于View
- TempData可以通过转向继续使用,因为它的值保存在Session中。但TempData只能经过一次传递,之后会被系统自动清除
- 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 中的数据就需要将其存到其他变量中。