tag parameter net mvc asp asp.net-mvc url routing url-routing asp.net-mvc-routing

asp.net-mvc - parameter - tag helper asp net core 2



¿Cómo obtener RouteData por URL? (2)

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()))));

Necesito obtener RoutData por cadena de URL dada en la aplicación ASP.NET MVC.

He encontrado la forma en que necesito simular HttpContextBase función de mi cadena URL y luego pasarlo al método RouteTable.Routes.GetRouteData() en el hilo de la ruta de análisis (URI a ruta) .

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


GetRouteData() Moq para determinar qué miembros de HttpContextBase se usan en GetRouteData() . Son:

  • Solicitud
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

Request.AppRelativeCurrentExecutionFilePath debería devolver la ruta con ~ , lo que exactamente necesito, así que la clase de utilidad puede ser como esta:

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") devuelve algo así como

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

Quizás esto sea útil para cualquiera.