3

所以...我有一个将生成电子邮件的业务对象/经理。

这些电子邮件将包含指向网站上各种内容的链接……因此需要了解 MVC 路由……或者至少要了解如何为网站生成 URL……

但是,我的业务对象将无法访问 RequestContext 等,并且电子邮件生成不一定是对网站的 Web 请求的结果(我有一个调度程序,它在将生成电子邮件的后台线程上运行)

任何想法如何在无法访问请求的情况下生成我的网址 - 因此无法使用 URLHelper ...

想法?

4

3 回答 3

3

为了在控制器外部访问 UrlHelper,您需要将其和路由数据提供给 HttpContext。这是一个例子:

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;    

HttpContextBase context = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper =  = new UrlHelper(new RequestContext(context, RouteTable.Routes.GetRouteData(context)));
于 2009-10-02T16:32:54.907 回答
1

我更喜欢定义模式并使路由和业务逻辑都知道它。表示相同 URL 架构的不同实现。

一些原因:

  1. 您的路由机制可能会改变。例如在功能中你可以切换到 url_rewrite 模块。
  2. 负载平衡安装可能存在的问题。
  3. 您甚至不需要尝试以未记录的方式使用 URLHelper。

顺便说一句,您可以轻松地从 URLHelper 替换 HttpRequest。我们曾经用它来进行单元测试。有关更多信息,只需搜索 HttpContextBase 的单元测试或查看MvcContrib源代码中的示例。这有助于在非托管环境中实例化 URL 助手和所有相关内容。但我仍然不认为这是一个好主意。

于 2009-07-04T19:04:15.487 回答
0

在 ASP.NET MVC5(可能还有 MVC4——我不确定它是什么时候引入的)中,您可以更直接地使用HttpRequest.RequestContext. 例如:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
于 2014-04-02T00:06:35.593 回答