在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");