Asp.net-Mvc

如何通過 URL 獲取 RouteData?

  • August 23, 2010

我需要RoutData通過 ASP.NET MVC 應用程序中的給定 URL 字元串來獲取。

我找到了需要根據我的 URL 字元串進行模擬的方法HttpContextBase,然後將其傳遞給Route Parsing (Uri to Route)執行緒中的方法。RouteTable.Routes.GetRouteData()

如何使用 URL 字元串模擬HttpContextBase檢索?RouteData``RouteTable.Routes.GetRouteData() 還是有另一種RouteData通過 URL 檢索的方法?

我使用Moq來確定HttpContextBaseGetRouteData(). 他們是:

  • 要求

    • AppRelativeCurrentExecutionFilePath
    • 路徑資訊

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

然後,您可以像這樣使用它(例如 on ~/Error/NotFound):

var rd = RouteUtils.GetRouteDataByUrl("~/Error/NotFound")

它應該返回一個如下所示的對象:

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

引用自:https://stackoverflow.com/questions/3545432