www net mvc framework asp asp.net-mvc

asp.net mvc - net - URL de cadena a RouteValueDictionary



framework asp.net mvc 5 (4)

Aquí hay una solución que no requiere burla:

var request = new HttpRequest(null, "http://localhost:3333/Home/About", "testvalue=1"); var response = new HttpResponse(new StringWriter()); var httpContext = new HttpContext(request, response); var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext)); var values = routeData.Values; // The following should be true for initial version of mvc app. values["controller"] == "Home" values["action"] == "Index"

Espero que esto ayude.

¿Existe una forma sencilla de convertir la URL de cadena a la colección RouteValueDictionary? Algún método como UrlToRouteValueDictionary(string url) .

Necesito este método porque quiero "analizar" la URL de acuerdo con la configuración de mis rutas, modificar algunos valores de ruta y usar urlHelper.RouteUrl () generar la URL de la cadena de acuerdo con la colección RouteValueDictionary modificada.

Gracias.


Aquí hay una solución que no requiere la creación de instancias de un montón de clases nuevas.

var httpContext = context.Get<System.Web.HttpContextWrapper>("System.Web.HttpContextBase"); var routeData = System.Web.Routing.RouteTable.Routes.GetRouteData(httpContext); var values = routeData.Values; var controller = values["controller"]; var action = values["action"];

El contexto de owin contiene un entorno que incluye HttpContext.


Necesitaría crear un HttpContext simulado, ya que las restricciones de las rutas lo requieren.

Este es un ejemplo que utilizo para probar en unidad mis rutas (se copió del marco Pro ASP.Net MVC ):

RouteCollection routeConfig = new RouteCollection(); MvcApplication.RegisterRoutes(routeConfig); var mockHttpContext = new MockedHttpContext(url); RouteData routeData = routeConfig.GetRouteData(mockHttpContext.Object); // routeData.Values is an instance of RouteValueDictionary //...


No confiaría en RouteTable.Routes.GetRouteData de ejemplos anteriores porque en ese caso corre el riesgo de perder algunos valores (por ejemplo, si los parámetros de la cadena de consulta no se ajustan completamente a ninguna de las rutas de mapeo registradas). Además, mi versión no requiere burlarse de un montón de objetos de solicitud / respuesta / contexto.

public static RouteValueDictionary UrlToRouteValueDictionary(string url) { int queryPos = url.IndexOf(''?''); if (queryPos != -1) { string queryString = url.Substring(queryPos + 1); var valuesCollection = HttpUtility.ParseQueryString(queryString); return new RouteValueDictionary(valuesCollection.AllKeys.ToDictionary(k => k, k => (object)valuesCollection[k])); } return new RouteValueDictionary(); }