asp.net mvc中ViewData、ViewBag和TempData的详解

一、ViewData和ViewBag

1、ViewData和ViewBag都是从Action向View传递数据的方式,当然还有其他方式如向View传递Model。

 

2、ViewData页面查询数据时需要转换合适的类型(var std in ViewData["students"] as IList<Student>),ViewBag不需要,他们的使用方法如下:

  1)ViewBag:

    controller中定义ViewBag.name="Tom";

    view中@ViewBag.name

  2)ViewData:

    controller中定义ViewBag["name"]="Tom";

    view中如下   

<ul>
@foreach (var std in ViewData["students"] as IList<Student>)
{
    <li>
        @std.StudentName
    </li>
}
</ul>

 

3、ViewData和ViewBag都是ControllerBase类的属性,ViewData类型是ViewDataDictionary(字典键值对结构),ViewBag类型是dynamic,如下图:

 

4、ViewData和ViewBag本质一样,在ViewData使用的key不能和ViewBag的key相同,否而回报运行时错误,

http://www.tutorialsteacher.com/mvc/viewbag-in-asp.net-mvc原句:Internally, ViewBag is a wrapper around ViewData. It will throw a runtime exception, if the ViewBag property name matches with the key of ViewData.

http://www.tutorialsteacher.com/mvc/viewdata-in-asp.net-mvc原句:ViewData and ViewBag both use the same dictionary internally. So you cannot have ViewData Key matches with the property name of ViewBag, otherwise it will throw a runtime exception.

 

5、ViewBag和ViewData仅针对当前Action中有效,生命周期和view相同。

 

二、TempData


1、TempData类型是TempDataDictionary。

 

2、 TempData用于把数据从一个action方法传到另一个action方法,两个action可以不再同一个controller中如下代码:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        TempData["name"] = "Tom";
        TempData["age"] = 25;
        return View();
    }

    public ActionResult About()
    {
        string userName;
        int userAge;        
        if(TempData.ContainsKey("name"]))
            userName = TempData["name"].ToString();
    
        if(TempData.ContainsKey("age"]))
            userAge = int.Parse(TempData["age"].ToString());

        return View();
    }
}

 

3、TempData 在第二次请求后会被清空,第三次请求则获取不到,如下:

第一次请求http://localhost/Home/Index,设置TempData["name"]="Tom";

第二次请求http://localhost/Home/About,可以获取var name = TempData["name"];

第三次请求http://localhost/Home/Details,通过var name = TempData["name"];是获取不到值的。

可以在第二次请求中TempData.Keep();语句来记住TempData["name"],这样第三次就可以继续获取了。

 

4、TempData 是使用Session存储数据的。

 

参考文章:http://www.tutorialsteacher.com/mvc/asp.net-mvc-tutorials

 

posted @ 2016-04-22 10:38  一夜秋2014  Views(974)  Comments(0Edit  收藏  举报