首页新闻找找看学习计划

mcv tempdata

0
悬赏园豆:10 [已解决问题] 解决于 2013-11-22 08:59

tempdata为毛不失效,只要不取就一直存在,跟session一样了?

Rookier的主页 Rookier | 小虾三级 | 园豆:647
提问于:2013-10-17 17:34
< >
分享
最佳答案
0

是地,TemeData就是利用的Session存储地,在每次执行Action之前会先从Session加载TempData,加载完立刻从Session删除,执行完Action之后再保存到Session,然后这样每次加载->删除->保存,所以用的时候一定要注意,一般用做跳转的时候传一些临时数据,比如:

Action1()

{

  TempData["aa"] = "bb";

  return RedireToAction("Action2")

}

Action2()

{

  var data = TempData["aa"];

}

总之就是要保证在存值之后接下来一定要取值,取值之后如果TempData的集合为0,就会从Session删除,顺便贴上核心代码:

public virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
    {
        HttpSessionStateBase session = controllerContext.HttpContext.Session;
        if (session != null)
        {
            Dictionary<string, object> dictionary = session["__ControllerTempData"] as Dictionary<string, object>;
            if (dictionary != null)
            {
                session.Remove("__ControllerTempData");
                return dictionary;
            }
        }
        return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
    }

    public virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        HttpSessionStateBase session = controllerContext.HttpContext.Session;
        bool flag = (values != null) && (values.Count > 0);
        if (session == null)
        {
            if (flag)
            {
                throw new InvalidOperationException(MvcResources.SessionStateTempDataProvider_SessionStateDisabled);
            }
        }
        else if (flag)
        {
            session["__ControllerTempData"] = values;
        }
        else if (session["__ControllerTempData"] != null)
        {
            session.Remove("__ControllerTempData");
        }
    }
收获园豆:10
netqiang | 菜鸟二级 |园豆:405 | 2013-11-05 17:30
其他回答(2)
1

跟Session有一点点不一样,tempdata只在一次请求中共享,而Session是一直处于共享

happydaily | 园豆:581 (小虾三级) | 2013-10-17 17:47

string ss=tempdata[key]; 这样这个key的temdata才为null,如果不使用,就一直存在?

支持(0) 反对(0) Rookier | 园豆:647 (小虾三级) | 2013-10-21 14:50

@Rookier: 在一个请求过程中,比如访问了多个Action,需要传数据就用tempdata。

测试的方法是在ActionResult Index中加入TempData["index"]="index",ViewData["indexView"]="indexView";在Index视图中加入代码@Html.RenderAction("edit");在ActionResult edit中写

TempData["index"],ViewData["indexView"],然后加个断点,访问Index页面,你就会看到TempData有值,而ViewData是空的。

支持(0) 反对(0) happydaily | 园豆:581 (小虾三级) | 2013-10-21 14:57

@Rookier: 用过TempData还有没有值?再@Html.RenderAction("Del");然后在ActionResult Del看下就行了,我也没有试过,你试了告诉我一下

支持(0) 反对(0) happydaily | 园豆:581 (小虾三级) | 2013-10-21 15:13

@happydaily: TempData 的值只要不取出来,跳转多个页面后相应key的tempdata还是有值的

支持(0) 反对(0) Rookier | 园豆:647 (小虾三级) | 2013-10-29 10:10
0

teampData的生命周期就只是针对单次请求的,而且数据是在客户端,session就不一样了,只要不过期则一直存在(前提是有被对象所引用的情况下),而且是处于服务端。

Zery | 园豆:6066 (大侠五级) | 2013-10-18 12:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册