MVC 4包罗万象的路线从未达到过(MVC 4 catch all route never reac

2019-09-02 23:08发布

当试图在MVC 4创造一个包罗万象的路线(东西我发现的几个例子,并根据我的代码),它返回一个404错误。 我在IIS 7.5上运行此。 这似乎是一个简单的解决方案,所以我缺少什么?

一个说明,如果我将“默认”路线上面的“包罗万象”的路径它的工作原理。 但当然再没有其他的控制器都曾经达到。

下面是代码:

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();
    }

}

Answer 1:

因为创建包罗万象的路线的最终目标是能够处理动态网址,我是无法找到直接回答上述原来的问题,我走近我的研究从不同的角度。 在此过程中,我碰到这个博客帖子: 自定义404没有路由匹配时

这种解决方案允许一个给定的URL内的多个区段的处理(即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;
 }


Answer 2:

这可能是因为无论走哪条路线your're与被匹配您的第一个测试这个 - 默认路由。 在MVC路由的工作方式,你传递的任何地址将尝试在出场顺序匹配你的路由集路由。 一旦它找到第一个匹配的路由就放弃进一步执行。 在这种情况下,你的缺省路由是一日一在列表中,如果它符合你的第二条路线将永远不会被审查。

基本上喜欢写东西http://www.mysite.com/Home/Testing/Item/Page在地址栏中,这应该不符合你的默认路由,然后尝试匹配包罗万象的路线。



Answer 3:

尝试定义你的路由上的可选字符串参数dynamicRoute:

 routes.MapRoute( 
      "CatchAll", 
      "{*dynamicRoute}", 
      new { controller = "CatchAll", action = "ChoosePage", dynamicRoute = UrlParameter.Optional } );


文章来源: MVC 4 catch all route never reached