如何在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}");

我正在努力去理解它。

如何在asp.net MVC中设置复杂的路由

要实现您的目标,您需要在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()。顺便说一下,这是未经测试的-可能有一些小错误。