MVC路由属性排除id

时间:2014-08-20 16:21:49

标签: asp.net-mvc routes

我有Home controller和Details动作,它接收到int id参数。 我希望地图“/”url到Home controller,Details action,id = 1。 另外,我希望地图网址如“/ st15”到Home controller,Details action,id = 15。

所以我写了以下属性

    [Route("~/{id:int:min(1):max(1)=1}")]
    [Route("st{id:int:min(2)}")]
    public ActionResult Details(int id)
    {...}

问题是url“/ 1”也映射到此操作,但我需要404

1 个答案:

答案 0 :(得分:2)

我建议利用在VS2012中使用默认MVC项目创建的RouteConfig.cs文件。

  public static void RegisterRoutes(RouteCollection routes)
  {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

     routes.MapRoute(
         name: "Details",
         url: "/st{id}",
         defaults: { controller = "Home", action = "Details", id = "1" }
     );

     routes.MapRoute(
         name: "Default",
         url: "/",
         defaults: new { controller = "Home", action = "Details", id = "1" }
     );
  }

这将尝试按照您将它们添加到RouteConfig文件的顺序将URL匹配到这两个指定的路由。由于“默认”路线在其网址定义中没有任何其他参数,因此对“/ 1”的调用与路线不匹配,您将获得404。

如果您使用了空白项目,添加RouteConfig文件是一件小事。只需添加一个RouteConfig.cs文件并定义该类以包含我列出的RegisterRoutes方法,然后在Global.asax文件的Application_Start函数中添加一行

     RouteConfig.RegisterRoutes(RouteTable.Routes);

你会很高兴。

(适用EDIT)

我不确定是否仍然存在冲突,但您可以通过简单地添加

将属性路由与标准路由范例相结合
routes.MapMvcAttributeRoutes();

到您的RegisterRoutes函数,在IgnoreRoute调用之后,应用程序将始终首先遵循您的Route属性,然后检查已定义的路由。

但是,既然您已经表示要完全避免使用标准路由方法,那么您可以简单地定义属性以采用以下路由:

[Route("~/")]
[Route("st{id:int:min(2)}")]
public ActionResult Details (int id = "1")
{...}

设置id参数的默认值,避免尝试处理属性本身的大小写。由于您在第二个Route属性中为{id}参数定义了最小值,因此您不必担心“/ st”尝试路由到该操作的情况。它不会与任何已定义的路线匹配,404也是如此。