asp.net映射路由,在控制器和视图中有参数

时间:2010-08-05 03:54:42

标签: asp.net-mvc-2

我需要创建一个这样的网址方案

friend/{userid}/wishlist

其中friend是控制器,wishlist是视图,userid是你希望看到的愿望清单的朋友的id。

我已经设置了这样的路线

 routes.MapRoute(
            "FriendWishlist",
            "friend/{userid}/wishlist",
            new { controller = "WishList", action="FriendWishlist", userid = 123}
            );

当我尝试浏览/friend/123/wishlist时,我收到以下错误

  

公共行动方法'123'不是   在控制器上找到   'GiffrWeb.Areas.Api.Controllers.FriendController'。

1 个答案:

答案 0 :(得分:1)

MVC中的路由按声明的顺序进行评估。这听起来很像你已经宣布你的路线 下面的路线

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    "FriendWishlist",
    "friend/{userid}/wishlist",
    new { controller = "WishList", action="FriendWishlist", userid = 123}
);

因此,MVC框架首先尝试将您的URL /friend/123/wishlist与默认路由匹配。因为它是所有变量而且一切都有默认值或者是可选的,所以它保证匹配。它不检查控制器和操作是否存在并采用相关参数。你有FriendController课 - 检查。 123行动 - 它会爆炸。

最简单的修复 - 将路由声明为默认路由(即只交换这两个语句),它应该可以正常工作。

我可能只是补充一点,当你显然有一个朋友控制器(你的错误信息是这样的)时,有一个以/friend/开头的URL进入WishList控制器似乎有点奇怪。

最后,我不能高度推荐,如果你引入自定义路由,你也要彻底测试这些路由 - 正如你所看到的,路由引擎通常可能不会按照你的想法去做。我推荐MvcContrib或Brad Wilson的blog post中的路线测试。