【问题标题】:Can I make a route without the action for only one action?我可以只为一个动作制作一条没有动作的路线吗?
【发布时间】:2013-08-22 15:01:49
【问题描述】:

这是我的设置示例:

public class UserController : Controller
{
  public ActionResult Index(int? id) { ... }

  [HttpPost]
  public ActionResult DoSomething(int id) { ... }

  public ActionResult Search([params]) { ... }
}

我希望能够通过这些途径访问它们:

/app/User/{id}
/app/User/DoSomething/{id}
/app/User/Search/

我尝试像这样设置我的路线,但是如果我尝试导航到/app/User/Search/ 或发布到/app/User/DoSomething/,则会点击Index 操作。

        routes.MapRoute(
            name: "UserWithoutIndex",
            url: "User/{id}",
            defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }
        );

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

我该怎么做?我认为在上面的UserWithoutIndex 路由之前指定它自己的路由中的每个特定操作是可行的,但是我有多个操作,我不想创建一个特定于控制器中每个操作的路由。

【问题讨论】:

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


    【解决方案1】:

    问题是您的第一条路线将匹配任何包含您提供的示例的两段 URL; /app/User/Search//app/User/DoSomething/ 以及值 SearchDoSomething 将分别放置在 id 占位符中。然后因为第一个路由正在匹配,您将收到Index 的操作。如果您的 id 将特别采用某种格式,您可以在第一条路线中为其指定一个约束,如下所示:

    routes.MapRoute(
            name: "UserWithoutIndex",
            url: "User/{id}",
            defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional },
            constraints: new { id = "your regex here" }
        );
    

    如果您的约束可以足够具体到 id 的格式而不是 SearchDoSomething 之类的内容将不匹配并且路由将不匹配,因此将尝试下一个路由。

    此外,如果在您希望将第一条路由作为目标的场景中始终指定id,则应删除id = UrlParameter.Optional 默认值,这样id 将是必需的,并且该路由将仅匹配两段 URL,因为现在 id 是可选的,路由也将匹配一段 URL。

    【讨论】:

    • 所以我可以将约束格式化为只接受一个数字,对吧?
    • 是的,你应该可以做到的。
    • 使用这样的东西来匹配一个或多个数字@"\d+"
    • 谢谢!这很好用。也就是说,毕竟我想要的 - 一种表明该路由在第二段是整数时适用的方法。如果我的 id 参数是字符串,这将不起作用。
    • 很高兴它起作用了 :) 您也可以创建一个正则表达式来匹配字符串,但前提是您知道该模式。你是对的,如果你没有任何方法来区分你想要的值和你没有的值,那么这可能并不理想,在这种情况下,我可能会推荐一种不同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2019-07-06
    • 2023-03-05
    相关资源
    最近更新 更多