我可以在没有动作的情况下进行一次行动吗?

时间:2013-08-22 15:01:49

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

以下是我的设置示例:

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路由之前指定其自己路由中的每个特定操作,但我有多个操作,我不想创建特定于控制器中每个操作的路由。

1 个答案:

答案 0 :(得分:1)

问题是您的第一条路线会匹配任何两段网址,其中包含您提供的示例; /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成为id必需且路线仅匹配两段网址,因为现在{{1}}是可选的,路线也会匹配单段网址。