【问题标题】:MVC route attribute exclude idMVC 路由属性排除 id
【发布时间】:2014-08-20 16:21:48
【问题描述】:

我有接收 int id 参数的 Home 控制器和 Details 操作。 我想将“/” url 映射到 Home 控制器,详细信息操作,id = 1。 我还想要将“/st15”之类的网址映射到 Home 控制器、详细信息操作、id = 15。

所以我写了以下属性

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

问题是 url "/1" 也映射到这个动作,但我需要 404

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    我建议利用 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 与这两个指定路由匹配。由于“默认”路由在其 URL 定义中没有任何其他参数,因此对“/1”的调用将与路由不匹配,您将得到 404。

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

         RouteConfig.RegisterRoutes(RouteTable.Routes);
    

    你会很高兴的。

    (编辑)

    我不确定是否仍然不会发生冲突,但是您可以通过简单的添加将属性路由与标准路由范式结合起来

    routes.MapMvcAttributeRoutes();
    

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

    但是,由于您已表明您希望完全避免使用标准路由方法,您可以简单地定义属性以采用以下路由:

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

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

    【讨论】:

    • 感谢您的建议,但是我在项目中使用路由属性会冲突。
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多