我试图提出一种创建“动态”路由的方法.我的意思是,我想要能够为每个命中分配一个路由的控制器和动作,而不是直接映射.
例如,路由可能看起来像这样“path / {object}”,并且当该路径被命中时,执行查找,提供适当的控制器/动作来进行调用.
我已经尝试发现创建自定义路由处理程序的机制,但是文档/可发现性在某种程度上是有点阴影的(我知道,它的beta – 我不会再期望).虽然,我不知道甚至最好的方法,甚至控制器工厂,甚至执行所有映射的默认控制器/动作可能是最好的路线(不是双关语).
任何建议将不胜感激.
解决方法
您可以随时使用所有语法(我不知道名称是否正确).
路线:
routeTable.MapRoute(
“路径”,
“{*路径}”,
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); } }