所以...我有一个将生成电子邮件的业务对象/经理。
这些电子邮件将包含指向网站上各种内容的链接……因此需要了解 MVC 路由……或者至少要了解如何为网站生成 URL……
但是,我的业务对象将无法访问 RequestContext 等,并且电子邮件生成不一定是对网站的 Web 请求的结果(我有一个调度程序,它在将生成电子邮件的后台线程上运行)
任何想法如何在无法访问请求的情况下生成我的网址 - 因此无法使用 URLHelper ...
想法?
所以...我有一个将生成电子邮件的业务对象/经理。
这些电子邮件将包含指向网站上各种内容的链接……因此需要了解 MVC 路由……或者至少要了解如何为网站生成 URL……
但是,我的业务对象将无法访问 RequestContext 等,并且电子邮件生成不一定是对网站的 Web 请求的结果(我有一个调度程序,它在将生成电子邮件的后台线程上运行)
任何想法如何在无法访问请求的情况下生成我的网址 - 因此无法使用 URLHelper ...
想法?
为了在控制器外部访问 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)));
我更喜欢定义模式并使路由和业务逻辑都知道它。表示相同 URL 架构的不同实现。
一些原因:
顺便说一句,您可以轻松地从 URLHelper 替换 HttpRequest。我们曾经用它来进行单元测试。有关更多信息,只需搜索 HttpContextBase 的单元测试或查看MvcContrib源代码中的示例。这有助于在非托管环境中实例化 URL 助手和所有相关内容。但我仍然不认为这是一个好主意。
在 ASP.NET MVC5(可能还有 MVC4——我不确定它是什么时候引入的)中,您可以更直接地使用HttpRequest.RequestContext
. 例如:
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);