Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Asp.Net MVC-最佳的“解决方案”;“动态”;路由_Asp.net Mvc_Routing_Routes - Fatal编程技术网

Asp.net mvc Asp.Net MVC-最佳的“解决方案”;“动态”;路由

Asp.net mvc Asp.Net MVC-最佳的“解决方案”;“动态”;路由,asp.net-mvc,routing,routes,Asp.net Mvc,Routing,Routes,我试图想出一种方法来创建“动态”路由。确切地说,我的意思是,我希望能够为每次点击分配控制器和路线操作,而不是直接将其映射 例如,路由可能看起来像“path/{object}”,当点击该路径时,将执行查找,提供要调用的适当控制器/操作 我已经尝试过发现创建自定义路由处理程序的机制,但是文档/可发现性目前有点可疑(我知道,它是beta版的,我不会再期待了)。尽管如此,我不确定这是否是最好的方法,也许控制器工厂或执行所有映射的默认控制器/操作可能是最好的方法(没有双关语) 如有任何建议,将不胜感激 您

我试图想出一种方法来创建“动态”路由。确切地说,我的意思是,我希望能够为每次点击分配控制器和路线操作,而不是直接将其映射

例如,路由可能看起来像“path/{object}”,当点击该路径时,将执行查找,提供要调用的适当控制器/操作

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


如有任何建议,将不胜感激

您始终可以使用“一网打尽”的语法(我不知道名称是否正确)

路线:

routeTable.MapRoute(
“路径”,
“{*path}”,
新建{controller=“Pages”,action=“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 Expres上运行。Casini不支持服务器。传输方法

请参阅此小手册:,选项3部分-它描述了如何构建自定义请求处理链。您知道为什么我们需要在调用TransferRequest之前检查TempData中的数据吗?