我implimenting我自己的文课,使用单一的模式。我想储存我的实例,它在HttpContext.的项目,因为它可以在所有部分的请求。我一直在读关于使用HttpContext与ASP.NET 视和的一个主要的痛苦的是,它介绍了测试的复杂性。我已经试图在研究的可测性的HttpContext.的项目,但所有我能找到的东西是上届会议。唯一的东西我已经找到的一个样章的专业ASP.NET 3.5软书Wrox(pdf链接在这里).在第15页,它说:

有些东西你可以不使用:HttpContext.项目
上在这一部分,我们来干净告诉你,我们骗了你:HttpContext不是之间共享ASP.NET 软和ASP.NET 网络的形式。因此,不能使用HttpContext.项目的收集储存和检索数据。

为此原因是因为一旦你向一个控制器,你HttpHandler成为该系统。网。视.MvcHandler,这是创建使用HttpContextWrapper,这将有其自己的定义HttpContext.电流。不幸的是,在此握手,事情就像HttpContext.项目不转移。

什么这可以归结为是HttpContext类型,尽管在寻找和探测非常相同的,都是不一样的,你不能通过数据,在这种方式。

现在,我已经尝试测试这个,我可以告诉大家,如果向另一个控制器使用RedirectToAction,HttpContext.项目的确仍然存在。我使用的是默认的ASP.NET 视项目,以试验这个。我所做的是,加这种方法要全球性的。asax.cs:

protected void Application_BeginRequest()
{
    Context.Items["Test"] = "Hello World";
}

在HomeController.cs,我已经改变了索引的方法:

public ActionResult Index()
{
    return RedirectToAction("About");
}

并改变了有关方法:

public ActionResult About()
{
    Response.Write(Convert.ToString(HttpContext.Items["Test"]));
    return View();
}

当我运行的应用程序、网页正重定向到/家庭/约,并响应。写的是正确的"hello World"串设全球性的。asax.cs。

因此,在我看来,如果我不了解什么是书的意思是当他们说 "之类的东西HttpContext.项目不转移"或它不会转移这一材料和它的好使用HttpContext.的项目。

如果你们建议,避免HttpContext.项目,是否有另一种替代方式来存储对象在请求在每请求的基础?

有帮助吗?

解决方案

你的问题是问一些事情,但我认为项目#1的回答你在寻找的。

  1. 是它很好用 Context.Items 为缓存在每个请求的基础?是的。如果在过程中,每请求,每个机网络场是您的标准,然后上下文。项目给你的。

  2. Context.Items 难以测试?尽测试,我会隐藏 Context.Items 背后有一个界面。这样你让单元的测试能力,而不必参考 Context.Items 直接。否则,你怎么需要测试有关 Context.Items?该框架将存储和检索的价值观?保持你的代码一无所知 System.Web 你会是一个快乐的露营车。

  3. Context.Items 生存 RedirectToAction?没有。你的测试就是无效的。它的设定"hello world"在每个网请求和测试跨越两个网络的请求。第一个是当索引的行动。第二是时候 RedirectToAction 行动(这是一个HTTP302).让它失败,设置一个新的价值在于指标的行动,看看如果它保留在有关行动。

其他提示

使用的TempData字典,它主要用于操作之间存储对象重定向:

public ActionResult Index()
{
    TempData.Add("Test", "Hello world");
    return RedirectToAction("About");
}

public ActionResult About()
{
    ViewData["Test"] = TempData["Test"];
    return View();
}

然后在您的视图检索值:

<%=ViewData["Test"] %>

我做了测试和TempData的确实,实际上,爆炸与会话状态禁用。我唯一的建议是不要保存在临时数据对象本身,而是存储简单的类型化领域已建议。既然你不序列化对象树它不应该是一个大的性能影响耗尽的进程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top