2011-02-09 10 views
5

Tengo una cadena dentro de la acción de uno de mis controladores que representa una URL de referencia. Los datos de ruta de la solicitud actual no son lo que estoy buscando (porque se llama desde la etiqueta de script dentro de otra vista).¿Cómo busco manualmente una ruta en el MVC.Net de RouteTable?

Deseo encontrar la Acción y el Controlador para la Url de referencia.

¿Hay alguna forma en que pueda usar manualmente una cadena como "/ Producto/23" para encontrar el controlador y la acción de la cadena como una URL produciría?

Respuesta

8

blogged sobre hacer esto exactamente lo hace un par de semanas:

Creating a RouteData instance from a URL

+0

Gracias. Parece que la clave es que tienes que crear una implementación concreta HttpRequestBase. Con eso, conviertes un URI y una Ruta de aplicación en Ruta. – ctrlShiftBryan

+0

@ctrl y @Scott - Debo señalar que aunque ese código * en su mayoría * funcionará, hay casos en que no lo hará. Una restricción de ruta personalizada puede elegir hacer todo tipo de cosas locas y esas locuras podrían no funcionar si intentas volver a escanear la tabla de rutas. La parte del enrutamiento debe ejecutarse solo durante las primeras partes de la canalización de solicitudes de ASP.NET, y debe ejecutarse solo una vez. No digo que no deba hacerlo, pero advierto que podría haber casos en los que no funcionará. – Eilon

+0

Excelente artículo y voy a usar tu método aquí en Stack Overflow. Sin embargo, creo que hay un error con '_pathInfo = uri.Query;' - ['PathInfo'] (http://msdn.microsoft.com/en-us/library/system.web.httprequest.pathinfo (v = vs .110) .aspx) parece ser cualquier cosa [entre la extensión de una url y el string de consulta '?'] (Http://www.nathanaeljones.com/blog/2008/pathinfo-woes) delimitador, por ejemplo 'http: //test.com/page.aspx/path/info? query = 1' tendría' PathInfo =/path/info'. Tener la consulta en 'PathInfo' estaba causando que las rutas no coincidan conmigo. –

4

Si lo que desea es utilizar los métodos MVC Tengo esto para trabajar.

  Uri returnUri = new Uri(returnUrl, UriKind.RelativeOrAbsolute); 
      if (!returnUri.IsAbsoluteUri) 
      { 
       returnUri = new Uri("http://localhost" + returnUrl); // localhost used just to get absolute URL 
      } 
      HttpContextWrapper httpContext = new HttpContextWrapper(
       new HttpContext(new HttpRequest(String.Empty, returnUri.AbsoluteUri, String.Empty), new HttpResponse(TextWriter.Null)) 
       ); 
      RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); 
Cuestiones relacionadas