MVC 4:自定义路由

时间:2013-09-26 15:42:29

标签: asp.net-mvc-4 custom-routes

我发现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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这里有几件事。

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

    < / LI>
  2. 如果您打算不在URL中提供操作的名称,则需要执行一些操作以确保定位正确的路由,以便使用正确的默认值。在您的情况下,您可以使用路由约束来区分这两者。尝试将您的啤酒ID路线更改为:

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

    约束将确保路由仅匹配两段URL,其中第二段由一个或多个数字组成。此路线以及啤酒名称的路线应放在默认路线之前。

  3. <强>更新

    我的配置似乎正在产生您想要的结果。我的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 }
    );