MVC 5 AttributeRouting Catch All

时间:2014-03-20 16:00:54

标签: asp.net-mvc-5 attributerouting

如何使用MVC中的新属性路由创建捕获所有路由

我试过这个: [Route("{pagenode}", Order = 999)]

但是当我有一条命名的路线时 [Route("contact"]

我收到"Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL."错误。

3 个答案:

答案 0 :(得分:16)

这可以通过属性路由完成,如果路径中的第一个“目录”是固定的。

例如,要匹配点击/questions/questions/4/questions/answers/42的任何内容,您可以使用[Route("questions/{*catchall}"]

答案 1 :(得分:3)

您无法通过属性路由执行此操作,请按照MVC4方式执行此操作:

在路线图中映射路线,如下所示:

routes.MapRoute("RouteName","{*url}",new { controller = "YourFancyController", action = "YourAction" });

这将是你的全能路线。

如果您想将所有路线映射到他们的控制器,您可以这样做:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapMvcAttributeRoutes();

    AreaRegistration.RegisterAllAreas();

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

答案 2 :(得分:-1)

执行此操作的能力必须已更改。

在我的默认控制器中,仍称为“Home'我有一个结果方法,我想为无法识别的URL结构执行。路由属性是:[Route("{*catchall}")]。对于任何旧事物都可以成功执行。

我有第二种方法,总是根据其路线成功执行(我已经抛出一些路线'样式'在它上面看它是否总是有效)。我只能假设框架总是最后注册catch-all路由,因为这是我看到的行为。

这也是一个全新的,没有配置(除了nuGet包)MVC 5项目,除了我的方法已被更改为返回JsonResult(甚至没有完成他们的工作但返回一些匿名类型的对象)。例如,catch-all返回:Json(new { Message = "Invalid Request" }JsonRequestBehavior.AllowGet)。是的,是的我先设置了StatusCode等等,这不是关于我的项目;)。

我确定我没有留下任何东西,因为它很少,但如果需要任何澄清,我会看到添加它。