Pregunta

Estoy tratando de llegar a un enfoque para crear enrutamiento "dinámica". Lo que quiero decir, exactamente, es que yo quiero ser capaz de asignar el controlador y la acción de una ruta para cada golpe en lugar de tener que mapea directamente.

Por ejemplo, una ruta puede tener este aspecto "ruta / {objeto}", y cuando es golpeado ese camino, una búsqueda se realiza proporcionando el controlador / acción apropiada para llamar.

He intentado descubrir los mecanismos para la creación de un controlador de ruta personalizada, pero la documentación / detectabilidad es un poco regular en el momento (lo sé, su beta - Yo no esperaría más). Aunque, no estoy seguro si eso es siquiera la forma y tal vez una fábrica de controlador o incluso un controlador por defecto / acción que lleva a cabo todas las asignaciones pueden ser la mejor ruta (sin juego de palabras) para ir.

Cualquier consejo sería apreciado.

¿Fue útil?

Solución

Siempre se puede usar una captura toda la sintaxis (no tengo ni idea de 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 tienen que vertía y analizar.

Para llamar a otro controlador se puede utilizar un RedirectToAction (creo que esto es más forma correcta). Con la redirección puede configurar un redirectionfor permanente ella. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top