如何移除Home控制器中非Index动作结果访问URL中的Home前缀
方案1:添加带Action约束的全局路由(适合路由规则统一的场景)
路由匹配遵循从上到下优先匹配的规则,你只需要在默认路由之前新增一条针对Home控制器的专属路由,通过action约束限定可匹配的动作名即可,不需要重复写多条路由:
// 必须放在默认路由之前才会优先匹配 routes.MapRoute( name: "HomeActionDirect", url: "{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 用正则约束当前路由仅匹配你要开放直接访问的Home控制器动作名 constraints: new { action = "Index|About|Contact" } ); // 原有默认路由保留即可 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
该方案下,只有URL第一段命中constraints里定义的动作名时才会走这条路由,不会干扰其他控制器的正常访问。
方案2:使用属性路由(MVC5及以上版本支持,灵活度更高)
如果你的路由规则比较零散,或者后续要加更多自定义路径,用属性路由更易维护:
- 首先在RouteConfig的RegisterRoutes方法最开头开启属性路由支持:
routes.MapMvcAttributeRoutes(); // 后面再放原有默认路由即可
- 直接在Home控制器的对应Action上添加路由属性即可:
public class HomeController : Controller { [Route("Index")] public ActionResult Index() { /* 你的业务逻辑 */ } [Route("About")] public ActionResult About() { /* 你的业务逻辑 */ } [Route("Contact")] public ActionResult Contact() { /* 你的业务逻辑 */ } }
你之前的方案失效是因为路由匹配到第一条符合规则的路由就会终止匹配,重复复制的同模板路由永远不会被触发,所以仅单个配置生效。
内容的提问来源于stack exchange,提问作者CodeQuest
相关产品推荐
相关产品推荐

