ASP.NET MVC 4 Маршруты - контроллер /id vs controller/action/id

Я пытаюсь добавить маршрут к умолчанию, так что у меня есть оба URL:

  • http://www.mywebsite.com/users/create
  • http://www.mywebsite.com/users/1

Это сделает первую работу маршрута:

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

Однако второй маршрут не будет работать явно.

Это заставит второй маршрут работать, но сломает первый:

routes.MapRoute(
     name: "Book",
     url: "books/{id}",
     defaults: new { controller = "users", action = "Details" }
);

Как объединить две конфигурации маршрута так, чтобы оба URL-адреса работали? Я прошу прощения, если в SO уже есть такой вопрос, я ничего не смог найти.

Ответы

Ответ 1

Ключ должен сначала указать более конкретные маршруты. Поэтому сначала поставьте "Книжный" маршрут. Изменить. Я думаю, вам также нужно ограничение, позволяющее только номерам соответствовать "id" части этого маршрута. Редактирование конца

routes.MapRoute(
    name: "Book",
    url: "books/{id}",
    defaults: new { controller = "users", action = "Details" },
    constraints: new { id = @"\d+" }
);

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

И убедитесь, что параметр "id" в вашем действии "Подробности" является int:

// "users" controller
public ActionResult books(int id)
{
    // ...
}

Таким образом, маршрут "Книги" не будет захватывать URL-адрес, например /users/create (поскольку второй параметр указан как число), и поэтому он перейдет к следующему ( "по умолчанию" ) маршруту.