Asp.Net MVC - "动态"路由的最佳方法

10

我正在尝试制定一种"动态"路由的方法。我的意思是,我想能够为每个请求分配一个路由控制器和动作,而不是直接映射到路由。

例如,一个路由可能看起来像这样"path/{object}",当该路径被请求时,会进行查找以提供适当的控制器/动作来调用。

我已经尝试了解创建自定义路由处理程序的机制,但目前文档/可发现性有点模糊(我知道,它是测试版-我不会期望更多)。虽然,我不确定这是否是最好的方法,也许一个控制器工厂,甚至是执行所有映射的默认控制器/动作可能是最好的方法(无意中说了句双关语)。

欢迎提供建议。


1
请查看这份小手册:MVC.Net Routing,第三个选项 - 它描述了如何构建自定义请求处理链。 - maxnk
1个回答

3
您可以始终使用catch all语法(我不知道名称是否正确)。
路由: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" }); 控制器操作定义为: public ActionResult Path(string path) 在控制器的操作中,您将拥有一个路径,因此只需分割并分析即可。
要调用另一个控制器,您可以使用RedirectToAction(我认为这是更合适的方法)。通过重定向,您可以设置永久重定向。 或者使用类似以下内容的东西:
 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);
        }
    }

然而,这种方法需要在IIS或IIS Express上运行,因为Casinni不支持Server.Transfer方法。

你知道为什么在调用TransferRequest之前需要检查TempData中的数据吗? - yurart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接