Asp.net MVC 5 MapRoute для нескольких маршрутов

У меня есть 3 маршрута в RouteConfig:

routes.MapRoute(
    name: "ByGroupName",
    url: "catalog/{categoryname}/{groupname}",
    defaults: new { controller = "Catalog", action = "Catalog" }
);
routes.MapRoute(
    name: "ByCatName",
    url: "catalog/{categoryname}",
    defaults: new { controller = "Catalog", action = "Catalog" }
);
routes.MapRoute(
    name: "ByBrandId",
    url: "catalog/brand/{brandId}",
    defaults: new { controller = "Catalog", action = "Catalog" }
);

и это параметры получения моего контроллера действий:

public ActionResult Catalog(
    string categoryName = null,
    string groupName = null,
    int pageNumber = 1,
    int orderBy = 5,
    int pageSize = 20,
    int brandId = 0,
    bool bundle = false,
    bool outlet = false,
    string query_r = null)
{
// ...
}

когда я использую в представлении ссылку с @Url.RouteUrl("ByBrandId", new {brandId = 5}), я получаю в действии параметр "categoryname"="brand" и brandId=0 вместо только brandId=5...

Когда я вызываю "http://localhost:3453/catalog/brand/5" с помощью routeurl «ByBrandId», я хочу получить brandId = 5 в actioncontroller..., эквивалент "http://localhost:3453/catalog/Catalog?brandId=1"

Благодарность


person Ssocial.it Web Agency    schedule 22.06.2016    source источник


Ответы (1)


Ваша маршрутизация настроена неправильно. Если вы передадите URL-адрес /Catalog/brand/something, он всегда будет соответствовать маршруту ByGroupName вместо предполагаемого маршрута ByBrandId.

В первую очередь следует исправить порядок. Но также первые 2 маршрута точно такие же, за исключением необязательного имени группы, поэтому вы можете упростить до:

routes.MapRoute(
    name: "ByBrandId",
    url: "catalog/brand/{brandId}",
    defaults: new { controller = "Catalog", action = "Catalog" }
);
routes.MapRoute(
    name: "ByGroupName",
    url: "catalog/{categoryname}/{groupname}",
    defaults: new { controller = "Catalog", action = "Catalog", groupname = UrlParameter.Optional }
);

Теперь, когда вы используете @Url.RouteUrl("ByBrandId", new {brandId = 5}), он должен дать вам ожидаемый результат /catalog/brand/5.

Полное объяснение см. в разделе Почему сначала сопоставляются специальные маршруты, а затем общие маршруты в asp.net mvc.

person NightOwl888    schedule 22.06.2016