2010-08-23 47 views
26

我需要在ASP.NET MVC應用程序中通過給定的URL字符串獲得RoutData如何通過URL獲取RouteData?

我發現我需要根據我的URL字符串模擬HttpContextBase,然後將它傳遞給RouteTable.Routes.GetRouteData()方法Route Parsing (Uri to Route)線程。

如何模擬HttpContextBase檢索RouteData通過URL字符串使用RouteTable.Routes.GetRouteData() 或者還有另一種方法通過URL檢索RouteData

+0

https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and -action-names-from-the-referrer-uri – 2017-07-26 21:02:34

回答

36

我使用Moq來確定中HttpContextBase的用法。它們是:

  • 請求
    • AppRelativeCurrentExecutionFilePath
    • PATHINFO

Request.AppRelativeCurrentExecutionFilePath應該返回路徑與~,我究竟需要,所以實用類可能是這樣的一種:

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 ""; } 
      } 
     } 
    } 
} 

如果傳遞〜/錯誤/ NOTFOUND,例如,RouteUtils.GetRouteByUrl("~/Error/NotFound")回報像

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

也許這將是任何人的幫助。

+1

它對我來說總是爲空 – 2015-12-04 11:39:07

+0

這對於QueryString有問題 – 2017-12-25 08:53:42

5

這對我的作品(.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。 – 2017-07-25 21:46:07