2010-08-23 33 views
26

Tôi cần lấy RoutData bằng chuỗi URL đã cho trong ứng dụng ASP.NET MVC.Cách nhận RouteData theo URL?

Tôi đã tìm ra cách tôi cần giả lập HttpContextBase dựa trên chuỗi URL của tôi và sau đó chuyển nó đến phương thức RouteTable.Routes.GetRouteData() trong chuỗi Route Parsing (Uri to Route).

Làm thế nào để giả lập HttpContextBase để truy xuất RouteData bằng chuỗi URL sử dụng RouteTable.Routes.GetRouteData()? Hoặc có cách nào khác để truy xuất RouteData theo URL không?

+0

https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and -action-names-from-the-referrer-uri –

Trả lời

36

Tôi đã sử dụng Moq để xác định thành viên nào của HttpContextBase được sử dụng trong GetRouteData(). Đó là:

  • Yêu cầu
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

Request.AppRelativeCurrentExecutionFilePath nên quay lại con đường với ~, những gì tôi biết chính xác cần, vì vậy lớp tiện ích có thể như thế này:

public static class RouteUtils 
{ 
    public static RouteData GetRouteDataByUrl(string url) 
    { 
     return RouteTable.Routes.GetRouteData(new RewritedHttpContextBase(url)); 
    } 

    private class RewritedHttpContextBase : HttpContextBase 
    { 
     private readonly HttpRequestBase mockHttpRequestBase; 

     public RewritedHttpContextBase(string appRelativeUrl) 
     { 
      this.mockHttpRequestBase = new MockHttpRequestBase(appRelativeUrl); 
     } 


     public override HttpRequestBase Request 
     { 
      get 
      { 
       return mockHttpRequestBase; 
      } 
     } 

     private class MockHttpRequestBase : HttpRequestBase 
     { 
      private readonly string appRelativeUrl; 

      public MockHttpRequestBase(string appRelativeUrl) 
      { 
       this.appRelativeUrl = appRelativeUrl; 
      } 

      public override string AppRelativeCurrentExecutionFilePath 
      { 
       get { return appRelativeUrl; } 
      } 

      public override string PathInfo 
      { 
       get { return ""; } 
      } 
     } 
    } 
} 

Nếu bạn vượt qua ~/Lỗi/notfound, ví dụ, RouteUtils.GetRouteByUrl("~/Error/NotFound") lợi nhuận giống như

RouteData.Values 
{ 
    controller = "Error", 
    action = "NotFound" 
} 

Có lẽ đây sẽ rất hữu ích cho bất cứ ai.

+1

Nó luôn luôn có null cho tôi –

+0

Đây là vấn đề với QueryString –

5

này làm việc cho tôi (.NET 4.5, MVC 5): https://average-joe.info/url-to-route-data/

System.Web.Routing.RouteData routeFromUrl = 
    System.Web.Routing.RouteTable.Routes.GetRouteData(
      new HttpContextWrapper(
       new HttpContext(
        new HttpRequest(null, path, query), 
        new HttpResponse(new System.IO.StringWriter())))); 
+0

StringWriter đó cần phải được xử lý. –

Các vấn đề liên quan