的TempData的价值仍然存在,直到它被读取或直到会话超时。以这种方式持久化TempData可实现重定向等场景,因为TempData中的值在单个请求之外是可用的。
Dictionary<string, object> tempDataDictionary = HttpContext.Current.Session["__ControllerTempData"] as Dictionary<string, object>;
if (tempDataDictionary == null)
{
tempDataDictionary = new Dictionary<string, object>();
HttpContext.Current.Session["__ControllerTempData"] = tempDataDictionary;
}
tempDataDictionary.Add("LastError", Server.GetLastError());
然后在你的行动,你可以使用
var error = TempData["LastError"];
但这里是其它解决方案,它可以不用做重定向
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
var httpException = exception as HttpException;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "HttpError500");
}
else
{
switch (httpException.GetHttpCode())
{
case 404:
routeData.Values.Add("action", "HttpError404");
break;
default:
routeData.Values.Add("action", "HttpError500");
break;
}
}
routeData.Values.Add("error", exception);
Server.ClearError();
IController errorController = DependencyResolver.Current.GetService<ErrorController>();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
然后控制器可以加动作
public ActionResult HttpError500(Exception error)
{
return View();
}
但tempDataDictionary是一个局部变量在这里。我该如何在使用Response.RidirectoTo – mathinvalidnik
重定向的方法中使用它以及字典是引用类型。所以你不是指定到局部变量,但指向内存,也有更新文件关于第二个可能的解决方案 –
在这种情况下,URL不会改变。我试过了。另外,这样我可以在控制器方法中执行Server.GetLastError(),并返回正确的值。 – mathinvalidnik