以下是我的设置示例:
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
路由之前指定其自己路由中的每个特定操作,但我有多个操作,我不想创建特定于控制器中每个操作的路由。
答案 0 :(得分:1)
问题是您的第一条路线会匹配任何两段网址,其中包含您提供的示例; /app/User/Search/
和/app/User/DoSomething/
以及值Search
和DoSomething
将分别放在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
的格式,那么Search
和DoSomething
之类的东西将不匹配,并且路线将不匹配,因此下一条路线将试过。
此外,如果您希望第一条路线定位的方案中始终指定id
,则应移除id = UrlParameter.Optional
默认值,以便id
成为id
必需且路线仅匹配两段网址,因为现在{{1}}是可选的,路线也会匹配单段网址。