MVC中基于约定的路由上的属性路由,哪个首先被称为?

时间:2018-10-25 12:41:52

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我假设常规路由将首先添加到路由表中,因为它已像这样在global.asax文件中注册了

RouteConfig.RegisterRoutes(RouteTable.Routes);

现在我在route.config中有一条这样的路由

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

    routes.MapMvcAttributeRoutes();
}

我有这样的属性路线

[Route("students/{id?}")]
public ActionResult Index(int? id)
{
    return View(id);
}

现在当我使用URL时

  

localhost:4200 //学生

学生路线被成功调用,但是当我使用这种路线时

  

localhost:4200 // students / 40

我得到错误,我不知道原因。当我从 RouteConfig 类中删除路由时,可以成功调用它。

谁能解释我的原因和方式?

1 个答案:

答案 0 :(得分:1)

在您的原始示例中,URL localhost:4200//students/40与基于约定的url: "{controller}/{action}/{id}",路由模板相匹配。

但是由于没有名为40的操作,它将失败。

现在,因为它已经匹配了一条路线,所以它不会再检查其他匹配项,因此您将最终遇到Not Found错误。

在Asp.Net MVC中,按添加到路由表的顺序调用路由。第一场比赛获胜,并且不再做任何进一步的检查。

通常在基于常规的更常规的路由之前添加目标属性路由,以避免发生示例中所遇到的路由冲突。

public static void RegisterRoutes(RouteCollection routes) { 
    //Attribute routes
    routes.MapMvcAttributeRoutes();

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