当尝试在MVC 4中创建捕获所有路由时(我发现了几个示例,基于我的代码),它返回404错误。我在IIS 7.5上运行它。这似乎是一个直接的解决方案,所以我错过了什么?
一个注意事项,如果我将“CatchAll”路线移到“默认”路线上方,它就可以了。但是当然没有其他控制器到达。
以下是代码:
Route.Config:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"CatchAll",
"{*dynamicRoute}",
new { controller = "CatchAll", action = "ChoosePage" }
);
控制器:
public class CatchAllController : Controller
{
public ActionResult ChoosePage(string dynamicRoute)
{
ViewBag.Path = dynamicRoute;
return View();
}
}
答案 0 :(得分:9)
由于创建捕获路线的最终目标是能够处理动态网址,而我无法找到上述原始问题的直接答案,因此我从不同的角度来看待我的研究。通过这样做,我发现了这篇博文:Custom 404 when no route matches
此解决方案允许处理给定网址中的多个部分 (即www.mysite.com/this/is/a/dynamic/route)
这是最终的自定义控制器代码:
public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
if (String.IsNullOrEmpty(controllerName))
{
throw new ArgumentException("MissingControllerName");
}
var controllerType = GetControllerType(requestContext, controllerName);
// This is where a 404 is normally returned
// Replaced with route to catchall controller
if (controllerType == null)
{
// Build the dynamic route variable with all segments
var dynamicRoute = string.Join("/", requestContext.RouteData.Values.Values);
// Route to the Catchall controller
controllerName = "CatchAll";
controllerType = GetControllerType(requestContext, controllerName);
requestContext.RouteData.Values["Controller"] = controllerName;
requestContext.RouteData.Values["action"] = "ChoosePage";
requestContext.RouteData.Values["dynamicRoute"] = dynamicRoute;
}
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
答案 1 :(得分:4)
这可能是因为你正在测试它的任何路线都匹配你的第一 - 默认路线。 MVC中的路由工作方式,您传入的任何地址都将尝试按照外观顺序匹配路由集合中的路由。一旦找到第一个匹配的路线,它就会中止进一步的执行。在这种情况下,您的默认路线在列表中是第一个,因此如果匹配,则永远不会检查您的第二个路线。
基本上在地址栏中写下http://www.mysite.com/Home/Testing/Item/Page之类的内容,这应该与您的默认路线不匹配,然后尝试匹配CatchAll路线。
答案 2 :(得分:0)
尝试在路线上定义可选字符串dynamicRoute参数:
routes.MapRoute(
"CatchAll",
"{*dynamicRoute}",
new { controller = "CatchAll", action = "ChoosePage", dynamicRoute = UrlParameter.Optional } );