我需要在ASP.NET MVC中的模型中生成一些URL。我想调用类似于UrlHelper.Action()的东西,它使用路由生成URL。我不介意填写通常的空白,如主机名,方案等。
有什么方法我可以打电话给那个吗?有没有办法构建UrlHelper?
答案 0 :(得分:274)
有用的提示,在任何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;
}
}
在创建的MyModel对象上调用Link
属性将返回有效的Url,以根据Global.asax中的路由查看模型
答案 1 :(得分:64)
我喜欢奥马尔的回答,但这对我不起作用。只是为了记录,这是我现在使用的解决方案:
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);
答案 2 :(得分:42)
可以在Controller操作中使用以下内容构建UrlHelper:
var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(...);
在控制器之外,可以通过从RouteTable.Routes RouteData创建RequestContext来构建UrlHelper。
HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));
(根据Brian的回答,添加了一个小代码修正。)
答案 3 :(得分:8)
是的,你可以实例化它。你可以这样做:
var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
new RequestContext(ctx,
RouteTable.Routes.GetRouteData(ctx));
RouteTable.Routes
是一个静态属性,所以你应该在那里做得好;要获得HttpContextBase
引用,HttpContextWrapper
会引用HttpContext
,而HttpContext
会提供该引用。
答案 4 :(得分:2)
在尝试了所有其他答案之后,我最终得到了
$"/api/Things/Action/{id}"
仇恨者会讨厌¯\ _(ツ)_ /¯
答案 5 :(得分:0)
我试图在页面内(控制器外)做类似的事情。
UrlHelper不允许我像Pablos那样容易地构建它,但后来我想起了一个老技巧来有效地做同样的事情:
string ResolveUrl(string pathWithTilde)
答案 6 :(得分:-29)
我认为您正在寻找的是:
Url.Action("ActionName", "ControllerName");