是地,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"); } }
跟Session有一点点不一样,tempdata只在一次请求中共享,而Session是一直处于共享
string ss=tempdata[key]; 这样这个key的temdata才为null,如果不使用,就一直存在?
@Rookier: 在一个请求过程中,比如访问了多个Action,需要传数据就用tempdata。
测试的方法是在ActionResult Index中加入TempData["index"]="index",ViewData["indexView"]="indexView";在Index视图中加入代码@Html.RenderAction("edit");在ActionResult edit中写
TempData["index"],ViewData["indexView"],然后加个断点,访问Index页面,你就会看到TempData有值,而ViewData是空的。
@Rookier: 用过TempData还有没有值?再@Html.RenderAction("Del");然后在ActionResult Del看下就行了,我也没有试过,你试了告诉我一下
@happydaily: TempData 的值只要不取出来,跳转多个页面后相应key的tempdata还是有值的
teampData的生命周期就只是针对单次请求的,而且数据是在客户端,session就不一样了,只要不过期则一直存在(前提是有被对象所引用的情况下),而且是处于服务端。