【问题标题】:Asp.Net MVC - Best approach for "dynamic" routingAsp.Net MVC - “动态”路由的最佳方法
【发布时间】:2008-12-22 04:34:32
【问题描述】:

我正在尝试提出一种创建“动态”路由的方法。我的意思是,确切地说,我希望能够为每个命中分配一个路由的控制器和动作,而不是直接映射它。

例如,一个路由可能看起来像这样“路径/{object}”,当该路径被命中时,将执行查找以提供适当的控制器/动作来调用。

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

任何建议将不胜感激。

【问题讨论】:

  • 请看一下这个小手册:MVC.Net Routing选项 3 部分 - 它描述了如何构建您的自定义请求处理链。

标签: asp.net-mvc routing routes


【解决方案1】:

你总是可以使用 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 中的数据吗?
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2011-04-27
  • 2011-02-01
  • 2011-01-07
  • 2012-07-23
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多