2008-12-22 25 views
10

Estoy tratando de encontrar un enfoque para crear enrutamiento "dinámico". Lo que quiero decir, exactamente, es que quiero poder asignar el controlador y la acción de una ruta para cada golpe en lugar de tenerlo mapeado directamente.Asp.Net MVC: el mejor enfoque para el enrutamiento "dinámico"

Por ejemplo, una ruta puede parecerse a esta "ruta/{objeto}" y cuando se golpea esa ruta, se realiza una búsqueda que proporciona el controlador/acción apropiado para llamar.

He intentado descubrir los mecanismos para crear un controlador de ruta personalizado, pero la documentación/detectabilidad es un poco sospechosa en este momento (lo sé, es beta - no esperaría más). Aunque, no estoy seguro de si eso es incluso el mejor enfoque y tal vez una fábrica de controladores o incluso un controlador/acción predeterminado que realiza todas las asignaciones puede ser la mejor ruta (sin juego de palabras) para ir.

Cualquier consejo sería apreciado.

+1

favor, eche un vistazo a este pequeño manual: [MVC .Net Routing] (http://stackoverflow.com/questions/379558/mvcnet- routing # 379823), sección ** Opción 3 **: describe cómo crear su cadena de procesamiento de solicitudes personalizada. – maxnk

Respuesta

3

Siempre puede usar una sintaxis catch all (no tengo idea si el nombre es correcto).

Ruta: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" });

acción del controlador se define como: public ActionResult Path(string path)

En la acción para el controlador tendrá un camino, por lo que sólo tiene que derramado y analizarlo.

Para llamar a otro controlador puede usar un RedirectToAction (creo que esta es la forma más adecuada). Con la redirección puede configurar una redirección permanente para ello. O utilizar un algo así:

internal class MVCTransferResult : RedirectResult 
    { 
     public MVCTransferResult(string url) : base(url) 
     { 
     } 
     public MVCTransferResult(object routeValues) 
       : base(GetRouteURL(routeValues)) 
     { 
     } 

     private static string GetRouteURL(object routeValues) 
     { 
      UrlHelper url = new UrlHelper(
       new RequestContext(
         new HttpContextWrapper(HttpContext.Current), 
         new RouteData()), 
         RouteTable.Routes); 
      return url.RouteUrl(routeValues); 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      var httpContext = HttpContext.Current; 

      // ASP.NET MVC 3.0 
      if (context.Controller.TempData != null && 
       context.Controller.TempData.Count() > 0) 
      { 
       throw new ApplicationException(
        "TempData won't work with Server.TransferRequest!"); 
      } 
      // change to false to pass query string parameters 
      // if you have already processed them 
      httpContext.Server.TransferRequest(Url, true); 

      // ASP.NET MVC 2.0 
      //httpContext.RewritePath(Url, false); 
      //IHttpHandler httpHandler = new MvcHttpHandler(); 
      //httpHandler.ProcessRequest(HttpContext.Current); 
     } 
    } 

Sin embargo este método requiere para ejecutarse en IIS o un IIS Expres Casinni no está apoyando un método Server.Transfer

+0

¿Sabe por qué necesitamos verificar los datos en TempData antes de llamar a Transferirquest? – yurart

Cuestiones relacionadas