如何在asp.net MVC中设置复杂的路由
本文关键字:设置 复杂 路由 MVC asp net | 更新日期: 2023-09-27 18:13:43
我希望设置符合这些模式的路由:
/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}");
我正在努力去理解它。
要实现您的目标,您需要在global.asax.cs中的RegisterRoutes
中添加三个单独的路由,它们应该按照以下顺序添加,并且必须在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
);
辅导员在我之前找到了答案。如果你想要那些精确的url和那些精确的方法,那么这是唯一的方法。你可以通过将GetUser和GetAllUsers组合成一个带有可空id的动作来减少路由的数量,例如
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()
。顺便说一下,这是未经测试的-可能有一些小错误。