2010-08-23 10 views
26

Necesito obtener RoutData por una cadena URL dada en la aplicación ASP.NET MVC.¿Cómo obtener RouteData por URL?

He encontrado la manera en que necesito simular HttpContextBase en base a mi cadena URL y luego pasarlo al método RouteTable.Routes.GetRouteData() en Route Parsing (Uri to Route) hilo.

Cómo burlarse de HttpContextBase para recuperar RouteData por cadena de URL usando RouteTable.Routes.GetRouteData()? ¿O hay otra manera de recuperar RouteData por URL?

+0

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

Respuesta

36

que utilizan Moq para determinar qué miembros de HttpContextBase se utilizan en GetRouteData(). Ellos son:

  • Solicitud
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

Request.AppRelativeCurrentExecutionFilePath debe devolver camino con ~, lo que necesita exactamente, por lo que la clase de utilidad podría ser como la siguiente:

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

Si pasa ~/error/NotFound, por ejemplo, RouteUtils.GetRouteByUrl("~/Error/NotFound") vuelve algo así como

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

Tal vez esto sea útil para nadie.

+1

Siempre es nulo para mí –

+0

Esto es problemático con QueryString –

5

Esto funciona para mí (.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

Ese StringWriter necesita ser eliminado. –