Answers:
有用的提示,在任何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;
}
}
Link
在创建的MyModel对象上调用属性将返回有效的URL,以根据Global.asax中的路由查看模型。
using
两个System.Web
和System.Web.Mvc
我喜欢Omar的回答,但这对我没有用。仅作记录,这是我现在使用的解决方案:
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);
可以从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的回答,并添加了较小的代码更正。)
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
this.ControllerContext.RequestContext
是HttpRequestContext
,并且的构造函数UrlHelper
期望RequestContext
。这两类无关。
是的,您可以实例化它。您可以执行以下操作:
var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
new RequestContext(ctx,
RouteTable.Routes.GetRouteData(ctx));
RouteTable.Routes
是静态属性,因此您应该可以;获取HttpContextBase
参考,HttpContextWrapper
参考HttpContext
并HttpContext
提供参考。