【问题标题】:ASP.NET MVC - Generate Routes Without Http/Request ContextASP.NET MVC - 生成没有 Http/Request 上下文的路由
【发布时间】:2009-12-18 22:30:48
【问题描述】:

我希望能够从 RouteCollection 生成 URL,而无需访问 HttpContext。查看 RouteCollection 的实现方式,所有方法都需要访问 RequestContext 才能获取虚拟路径。

我已经通过模拟 HttpContext 解决了这个问题,但这增加了对 RhinoMocks 的尴尬依赖,并且不是一个合理的解决方案。我是否还有其他选项可以在上下文之外生成 URL?

【问题讨论】:

    标签: asp.net-mvc routing httpcontext


    【解决方案1】:

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

    我的建议是在这种情况下根本不使用路由,并将 URL 硬编码到电子邮件中。电子邮件中的链接必须具有完全限定的 URL(主机名 + 路径),并且路由甚至无法为 URL 生成主机名,因此您已经必须进行硬编码。

    【讨论】:

      【解决方案2】:

      抱歉,习惯于在 MVC 框架中模拟。一旦你开始测试,你就会需要它。那里有很多东西:HttpContext、Session、Server——所有东西都会泄漏到你的控制器中。如果要生成路径,要么需要与 HttpContext 对话(在 MVC 中,这实际上是 HttpContextBase,所以我猜你可以编写自己的具体实现),或者你需要模拟它。

      【讨论】:

      • 我不反对模拟测试情况。但是,我没有在测试中这样做。我正在通过异步服务生成电子邮件。由于它是异步的,因此无法访问 HttpRequest。
      • 大概是一个动作开始了生成电子邮件的过程。尝试从操作中进行路由调用(当您可以访问 RequestContext 时),然后将结果传递给生成电子邮件的任何进程。
      • 在某些情况下,电子邮件是在没有网络触发的情况下生成的。例如,每日电子邮件或提醒电子邮件。
      • 在这些情况下,我在我的 RouteData 中设置了专业路线,并在我的电子邮件中对路线进行了硬编码。这样,我引用mysite.com/reset_password,并且知道它会被正确路由,无论该电子邮件是如何生成的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2013-05-07
      • 1970-01-01
      • 2016-01-30
      • 2015-07-13
      • 2021-11-22
      相关资源
      最近更新 更多