1

我看到 MVC 路由存在很多问题,并且在获取匹配 URL 的路由时也遇到了类似的问题。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

routes.MapRoute("Beer", "Beer/{beerid}", new { controller = "Beer", action = "Id", beerid = 0});

routes.MapRoute("Beer", "Beer/{beername}", new { controller = "Beer", action = "Name" });

BeerController 方法

public ActionResult Id(int beerid)
public ActionResult Name(string beername)

如果我将方法更改为以下,

public ActionResult Id(int? id)    
public ActionResult Name(string id)

默认路由适用于以下 URL:

http://localhost/Beer/Id/100
http://localhost/Beer/Name/Coors

但我想要的只是

http://localhost/Beer/100
http://localhost/Beer/Coors

有任何想法吗?

4

1 回答 1

3

所以这里有几件事。

  1. 更具体的路由应该放在更一般的路由之前,因为将使用匹配的第一个路由,并且按照添加的顺序检查路由。

  2. 如果您不打算在 URL 中提供操作的名称,那么您需要做一些事情来确保目标路由正确,以便使用正确的默认值。在您的情况下,您可以使用路由约束来区分两者。尝试将您的 beer id 路线更改为:

    routes.MapRoute(
        name: "Beer",
        url: "Beer/{beerid}",
        defaults: new { controller = "Beer", action = "Id", beerid = 0},
        constraints: new { beerid = @"\d+" }
    );
    

    约束将确保路由仅匹配第二段由一位或多位数字组成的双段 URL。这条路线以及您的啤酒名称路线应放在默认路线之前。

更新

我的配置似乎产生了你想要的结果。我的整个RegisterRoutes方法如下:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Id",
    url: "Beer/{beerid}",
    defaults: new { controller = "Beer", action = "Id", beerid = 0 },
    constraints: new { beerid = @"\d+" }
);

routes.MapRoute(
    name: "Name",
    url: "Beer/{beername}",
    defaults: new { controller = "Beer", action = "Name" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
于 2013-09-26T17:27:11.020 回答