2010-08-23 8 views
26

Ich muss RoutData durch angegebene URL-Zeichenfolge in ASP.NET MVC-Anwendung erhalten.Wie bekomme ich RouteData per URL?

Ich habe die Art und Weise gefunden, die ich HttpContextBase basierend auf meiner URL-Zeichenfolge mocken muss und dann an RouteTable.Routes.GetRouteData() Methode in Route Parsing (Uri to Route) Thread übergeben.

Wie mockt man HttpContextBase, um RouteData per URL-String unter Verwendung RouteTable.Routes.GetRouteData() abzurufen? Oder gibt es eine andere Möglichkeit, RouteData per URL abzurufen?

+0

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

Antwort

36

I verwendet Moq, um zu bestimmen, was die Mitglieder von HttpContextBase in GetRouteData() verwendet werden. Sie sind:

  • Anfrage
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

Request.AppRelativeCurrentExecutionFilePath sollte Pfad zurückkehren mit ~, was ich genau brauche, so Utility-Klasse wie dieses sein kann:

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

Wenn Sie ~/Error/NotFound, zum Beispiel passieren, RouteUtils.GetRouteByUrl("~/Error/NotFound") kehrt so etwas wie

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

Vielleicht wird dies für jeden hilfreich sein.

+1

Es kommt immer Null für mich –

+0

Dies ist problematisch mit QueryString –

5

Dies funktioniert für mich (.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

, dass StringWriter entsorgt werden muss. –