在ASP.NET MVC模型中调用UrlHelper

我需要在ASP.NET MVC模型中生成一些URL。 我想调用像UrlHelper.Action(),它使用路由来生成的URL。 我不介意填补通常的空白,如主机名称,scheme等。

有什么方法可以打电话吗? 有没有办法构build一个UrlHelper?

有用的提示,在任何ASP.NET应用程序中,您都可以获取当前HttpContext的引用

HttpContext.Current 

它是从System.Web派生的。 因此,以下内容将在ASP.NET MVC应用程序的任何地方工作:

 UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext); url.Action("ContactUs"); // Will output the proper link according to routing info 

例:

 public class MyModel { public int ID { get; private set; } public string Link { get { UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext); return url.Action("ViewAction", "MyModelController", new { id = this.ID }); } } public MyModel(int id) { this.ID = id; } } 

在创build的MyModel对象上调用Link属性将返回有效的Url,以便根据Global.asax中的路由查看Model

我喜欢奥马尔的回答,但这不适合我。 只是为了logging这是我现在使用的解决scheme:

 var httpContext = HttpContext.Current; if (httpContext == null) { var request = new HttpRequest("/", "http://example.com", ""); var response = new HttpResponse(new StringWriter()); httpContext = new HttpContext(request, response); } var httpContextBase = new HttpContextWrapper(httpContext); var routeData = new RouteData(); var requestContext = new RequestContext(httpContextBase, routeData); return new UrlHelper(requestContext); 

一个UrlHelper可以在一个Controller动作中构build,具体如下:

  var url = new UrlHelper(this.ControllerContext.RequestContext); url.Action(...); 

在控制器外部,可以通过从RouteTable.Routes RouteData创buildRequestContext来构造UrlHelper。

 HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current); UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper))); 

(根据Brian的回答,添加了一些小的代码更正。)

是的,你可以实例化它。 你可以做一些事情:

 var ctx = new HttpContextWrapper(HttpContext.Current); UrlHelper helper = new UrlHelper( new RequestContext(ctx, RouteTable.Routes.GetRouteData(ctx)); 

RouteTable.Routes是一个静态属性,所以你应该可以在那里; 得到一个HttpContextBase引用, HttpContextWrapper引用HttpContext ,而HttpContext传递这个引用。

我试图从一个页面(控制器之外)做类似的事情。

UrlHelper不允许我像Pablos那样简单地回答这个问题,但是后来我想起了一个古老的把戏,就是要有效地做同样的事情:

 string ResolveUrl(string pathWithTilde) 

我觉得你要找的是这样的:

 Url.Action("ActionName", "ControllerName");