无法使用的内容:HttpContext.Items
在本节中,我们坦白告诉您,我们对您撒谎了:HttpContext在ASP.NET MVC和ASP.NET Web Forms之间不共享。因此,您不能使用HttpContext.Items集合来存储和检索数据位。
原因是一旦重定向到控制器,您的HttpHandler就变成了System.Web.Mvc.MvcHandler,它是使用HttpContextWrapper创建的,该HttpContextWrapper将具有其自己的HttpContext.Current定义。不幸的是,在这个握手期间,像HttpContext.Items这样的东西没有被传输。
这意味着HttpContext类型,尽管看起来和听起来非常相似,但并不相同,您不能以这种方式传递数据。
现在,我已经尝试过测试这个问题,并且据我所知,如果使用RedirectToAction重定向到另一个控制器,HttpContext.Items仍然存在。 我正在使用默认的ASP.NET MVC项目进行测试。 我所做的是,在Global.asax.cs中添加了此方法:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
在HomeController.cs中,我已将Index方法更改为:
public ActionResult Index()
{
return RedirectToAction("About");
}
并将 About 方法更改为:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
当我运行应用程序时,页面会正确重定向到 /Home/About 并在 global.asax.cs 中设置的 Response.Write 正确显示 "Hello World" 字符串。因此,对我来说似乎我不理解书中所说的“像 HttpContext.Items 这样的东西不会被传输”,或者它确实传输了这些内容,并且可以使用 HttpContext.Items。
如果您建议我避免使用 HttpContext.Items,是否有另一种替代方法以按每个请求存储对象?