2009-12-18 82 views
9

我希望能够从RouteCollection生成URL而无需访问HttpContext。查看RouteCollection的实现方式,所有方法都需要访问RequestContext以获取虚拟路径。ASP.NET MVC - 生成没有Http /请求上下文的路由

我已经通过嘲笑HttpContext解决了这个问题,但是这增加了对RhinoMocks的尴尬依赖,并不是一个合理的解决方案。除了上下文之外,还有其他选项可用于生成Url吗?

回答

1

对不起,但习惯了在MVC框架中嘲笑。一旦你进入测试阶段,你就会需要它。这里有很多:HttpContext,Session,Server - 所有泄漏到控制器中的东西。如果你想生成路径,你需要与HttpContext交谈(在MVC中,这实际上是HttpContextBase,所以你可以编写你自己的具体实现,我猜),或者你需要嘲笑它。

+1

我不反对嘲笑测试情况。但是,我没有在测试中这样做。我正在通过异步服务生成电子邮件。由于它是异步的,因此无法访问HttpRequest。 – bromanko 2009-12-18 22:43:14

+0

假设一个行动正在开始生成电子邮件的过程。尝试在动作中(当你有权访问RequestContext时)进行路由调用,然后将结果传递给生成电子邮件的任何进程。 – Levi 2009-12-18 22:51:53

+0

有些情况下,电子邮件是在没有网络的情况下生成的。例如,每天的电子邮件或提醒电子邮件。 – bromanko 2009-12-19 16:06:28

3

确实是一个很好的问题。路由本身对于从正在运行的ASP.NET应用程序中被调用有一定的依赖性,比如获取应用程序根URL以及URL中的任何无cookie的表单或会话cookie。虽然创建模拟对象是一个理论上的解决方案,但它肯定不推荐在运行时使用。

我的建议是在这种情况下根本不使用路由,并将URL编码到电子邮件中。电子邮件中的链接必须具有完全限定的URL(主机名+路径),路由甚至不能为URL生成主机名,所以这是您必须硬编码的内容。