我发现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)
默认路由使用以下网址:
http://localhost/Beer/Id/100
http://localhost/Beer/Name/Coors
但我想要的只是
http://localhost/Beer/100
http://localhost/Beer/Coors
有什么想法吗?
答案 0 :(得分:3)
这里有几件事。
更多具体路线应放在之前更多的一般路线上,因为将使用匹配的第一条路线,并按照添加的顺序检查路线。
< / LI>如果您打算不在URL中提供操作的名称,则需要执行一些操作以确保定位正确的路由,以便使用正确的默认值。在您的情况下,您可以使用路由约束来区分这两者。尝试将您的啤酒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 }
);