Как настроить сложную маршрутизацию в asp.net MVC - PullRequest
4 голосов
/ 04 ноября 2011

Я ищу для настройки маршрутов, которые соответствуют этим шаблонам:

/users
Mapped to action GetAllUsers()

/users/12345
Mapped to action GetUser(int id)

/users/1235/favorites
mapped to action GetUserFavorites(int id)

Контроллер всегда должен быть UsersController.Я думал, что это сработает, но это не так.

routes.MapRoute("1", 
                "{controller}/{action}/{id}", 
                new { id = UrlParameter.Optional, action = "index" });

routes.MapRoute("2", 
                "{controller}/{id}/{action}");

Я изо всех сил стараюсь обернуть это вокруг себя.Любая помощь будет высоко ценится.

Ответы [ 2 ]

10 голосов
/ 04 ноября 2011

Для достижения вашей цели вам понадобятся три отдельных маршрута в RegisterRoutes в global.asax.cs, которые должны быть добавлены в следующем порядке и должны быть перед маршрутом Default (предполагается, что id должен быть целое число):

routes.MapRoute(
    "GetUserFavorites", // Route name
    "users/{id}/favorites",  // URL with parameters
    new { controller = "Users", action = "GetUserFavorites" },  // Parameter defaults
    new { id = @"\d+" } // Route constraint
);

routes.MapRoute(
    "GetUser", // Route name
    "users/{id}",  // URL with parameters
    new { controller = "Users", action = "GetUser" }  // Parameter defaults
    new { id = @"\d+" } // Route constraint
);

routes.MapRoute(
    "GetAllUsers", // Route name
    "users",  // URL with parameters
    new { controller = "Users", action = "GetAllUsers" }  // Parameter defaults
);
3 голосов
/ 04 ноября 2011

Counsellorben получил ответ раньше, чем я. Если вам нужны именно эти URL-адреса и эти точные методы, то это единственный способ. Вы можете уменьшить количество маршрутов, объединив GetUser и GetAllUsers в одно действие с обнуляемым идентификатором, например

routes.MapRoute(
    "GetUser",
    "users/{id}",  
    new { controller = "Users", action = "GetUser", id = UrlParameter.Optional} 
    new { id = @"\d+" } // Route constraint
);

Который вызвал бы метод GetUser(int? id)

Если вы хотите использовать URL-адрес для установки контроллера и автоматически вызываемого действия, вам потребуется что-то вроде

   routes.MapRoute(
        "GetUser",
        "{controller}/{action}/{id}",  
        new { id = UrlParameter.Optional} 
        new { id = @"\d+" } // Route constraint
    );

Но для этого потребуется изменить нужные URL-адреса, чтобы /users/getuser/1234 перешел на GetUser(int id), а /users/getallusers - на GetAllUsers(). Кстати, это не проверено - могут быть небольшие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...