在ASP.NET MVC中的模型中调用UrlHelper

pup*_*eno 156 asp.net-mvc urlhelper

我需要在ASP.NET MVC中的模型中生成一些URL.我想调用类似于UrlHelper.Action()的东西,它使用路由生成URL.我不介意填写通常的空白,如主机名,方案等.

有什么方法我可以打电话给那个吗?有没有办法构建UrlHelper?

Oma*_*mar 274

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

HttpContext.Current
Run Code Online (Sandbox Code Playgroud)

它是从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
Run Code Online (Sandbox Code Playgroud)

例:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,.NET4 +支持Request.RequestContex (6认同)

pup*_*eno 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);
Run Code Online (Sandbox Code Playgroud)

  • 请注意这个答案 - dummied RequestContext会产生一个始终返回空字符串的UrlHelper. (4认同)
  • 考虑到UrlHelper类依赖于请求上下文(以及HTTP上下文),手动构造这些上下文对象可能会产生意外结果.如果HttpContext.Current为null并且您使用此方法,我会谨慎行事. (3认同)

Nat*_*lor 44

UrlHelper可以在Controller动作中构造,具有以下内容:

 var url = new UrlHelper(this.ControllerContext.RequestContext);
 url.Action(...);
Run Code Online (Sandbox Code Playgroud)

在控制器之外,可以通过从RouteTable.Routes RouteData创建RequestContext来构造UrlHelper.

HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));
Run Code Online (Sandbox Code Playgroud)

(根据Brian的回答,添加了一个小代码修正.)

  • 但我在模型中没有控制器. (2认同)
  • 无需创建新的请求上下文:`var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);` (2认同)

Bri*_*ins 8

是的,你可以实例化它.你可以这样做:

var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
   new RequestContext(ctx,
   RouteTable.Routes.GetRouteData(ctx));
Run Code Online (Sandbox Code Playgroud)

RouteTable.Routes是一个静态属性,所以你应该在那里; 获取HttpContextBase参考,HttpContextWrapper参考HttpContextHttpContext传递它.