0

这是我的设置示例:

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

4

1 回答 1

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" }
    );

如果您的约束可以足够具体到比的格式,idSearch不会DoSomething匹配并且路由将不匹配,因此将尝试下一条路由。

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

于 2013-08-22T15:12:39.323 回答