2009-07-04 62 views
3

所以...我有一个业务对象/管理器将要生成电子邮件。从管理层MVC路由生成URL ...

这些电子邮件会包含指向各种内容的网站上...,因此需要了解有关MVC路由..或至少如何生成的网站网址...

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

任何想法我可以如何无法访问请求而生成我的网址 - 因此无法使用URLHelper ...

想法?

回答

1

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

一些原因:

  1. 你的路由机制可能发生变化。例如,在功能中,您可以切换到url_rewrite模块。
  2. 负载平衡安装可能存在的问题。
  3. 你甚至不需要以非正式的方式使用URLHelper。

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

+0

那么..只要我包裹我的实现在一个接口,这不应该是一个问题?例如IRouteHelper? 无论如何...不确定你的意思是“我更喜欢定义模式,并让路由和业务逻辑都知道它” - 如何使用模式驱动开发来定义路由? – iasksillyquestions 2009-07-04 19:07:18

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))); 
0

在ASP.NET MVC5(也可能是MVC4 - 我不知道它被引入时),你可以这样做更直接使用HttpRequest.RequestContext。例如:

var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);