在ASP.NET MVC 3中生成与控制器无关的URL

5

我有一个mvc 3应用程序,其中包含一个后台线程,检查一些数据库项目的状态。当它发现一个过期的项目时,它会发送一封电子邮件。在电子邮件中,我想包括调用以查看状态的操作的url。如果这是从控制器完成的,我将使用UrlHelper,例如:

string body_url = "For more details see: " + Url.Action("Details", "MyOrder", new { OrderId = order.OrderId }, Constants.HttpProtocol);

然而,我不在控制器中,也不是从控制器调用我的方法,它是在应用程序启动时启动的。是否有一种方法可以生成有效的UrlHelper?如果没有,是否可以在独立于控制器的情况下生成有效的URL,而不必诉诸于硬编码路径?

1个回答

4

这是一些理论性的内容... 参考 msdnso ... 在后台线程上执行会让事情变得有趣 :)

var request = new HttpRequest("/", "http://example.com", ""); //hopefully you can hardcode this or pull from config?
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);

var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);

var urlHelper = new UrlHelper(requestContext);
var url = urlHelper.Action("ActionName", "ControllerName");

硬编码基本URL似乎很遗憾,特别是考虑到它可能会根据我运行测试或生产而改变。我希望有一种从应用程序中获取基本URL的方法。 - Simon Parker
当您启动后台线程时,可以将HttpContext.Current信息传递给它。但一定要只使用其基本URL部分!请参考此处:https://dev59.com/oE_Ta4cB1Zd3GeqPBYWl - felickz
“HttpContext.Current” 在应用程序启动时不可用,这正是 @SimonParker 希望能够在此时生成路由 URL 的时候。 - Paul d'Aoust
1
@SimonParker 你可以使用 Microsoft.Web.Administration.WebConfigurationManager 来在运行时获取当前站点绑定列表。然后你只需要获取第一个绑定即可。这样做有些丑陋,但它能够正常工作! - Paul d'Aoust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接