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.