String URL a RouteValueDictionary

¿Hay una manera fácil de convertir la cadena URL a la colección RouteValueDictionary? Algún método como UrlToRouteValueDictionary(string url) .

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

Gracias.

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.

Debería crear un HttpContext falso como las rutas lo requiere.

Aquí hay un ejemplo que utilizo para probar mis rutas en forma unitaria (fue copiado 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 //... 

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

 var httpContext = context.Get("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 owin contiene un entorno que incluye HttpContext.

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 por completo 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(); }