Маршрутизация атрибута по основанной на соглашении маршрутизации в MVC, какой из них будет назван первым? - PullRequest
0 голосов
/ 25 октября 2018

Я предполагаю, что условная маршрутизация будет сначала добавлена ​​в таблицу маршрутизации, потому что она регистрируется в файле global.asax, как это

RouteConfig.RegisterRoutes(RouteTable.Routes);

Теперь у меня есть маршрут, подобный этому, в маршруте.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 // Students

Маршрут ученика вызывается успешно, но когда я использую маршрут, подобный этому

localhost: 4200 // студентов / 40

Iполучить ошибку, я не знаю причину почему.Когда я удаляю маршрут из класса RouteConfig , я могу успешно его вызвать.

Может кто-нибудь объяснить мне, почему и как?

1 Ответ

0 голосов
/ 25 октября 2018

В исходном примере 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 }
    );
}
...