Mvc多通配符路由配置:Amp目录下控制器路由添加问题
正确配置MVC属性路由实现AMP页面路由匹配
嘿,我来帮你搞定这个路由配置的问题!结合你给出的现有代码和需求,咱们一步步来确保路由能正常匹配:
一、规范AMP控制器的属性路由设置
首先,你的AMP控制器放在Amp文件夹下,要符合MVC的命名规范(控制器类名必须以Controller结尾),同时建议给控制器添加路由前缀,让Action的路由配置更简洁清晰,也避免重复写amp/前缀:
// 注意命名空间要对应Amp文件夹的结构 namespace YourProject.Controllers.Amp { // 控制器级路由前缀:所有Action的路由都会以amp/开头 [Route("amp")] public class AmpController : Controller { // 这里的路由会自动拼接成 amp/{category}/{subcategory?}/{property?} // 注意:路由占位符要和参数名一一对应,你原来的参数subSubCategory要和路由里的占位符匹配,我这里统一成property示例 [Route("{category}/{subcategory?}/{property?}")] public ActionResult Amp(string category, string subcategory, string property) { // 你的业务逻辑代码 return View(); } } }
小提醒:如果你的路由占位符是
{subSubCategory?},那参数名必须改成string subSubCategory,MVC是通过名称来绑定路由参数的,名称不匹配会导致参数值为null。
二、调整路由注册代码,避免冲突
你已经启用了属性路由(routes.MapMvcAttributeRoutes()),这是正确的核心步骤,接下来要注意:
删除你未写完的传统AMP路由:
你原来的routes.MapRoute("Amp", "amp...")完全不需要,因为属性路由已经能处理所有amp/开头的请求了,传统路由和属性路由共存容易导致匹配优先级冲突。保持路由注册顺序:
必须先注册属性路由,再注册默认的传统路由,这样属性路由会优先匹配请求,不会被默认路由拦截。完整的路由注册代码应该是这样:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 第一步:注册所有属性路由(优先匹配) routes.MapMvcAttributeRoutes(); // 第二步:注册默认传统路由(处理非属性路由的请求) routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
三、验证路由匹配效果
现在配置完成后,不同的请求会正确匹配到对应的Action:
- 请求
/amp/books/fiction/bestseller→ 匹配AmpController的AmpAction,参数category=books、subcategory=fiction、property=bestseller - 请求
/books/fiction/bestseller→ 继续匹配你原来的SubPageAction,完全互不干扰
额外注意事项
- 可选参数(带
?的占位符)必须放在路由模板的最后,你当前的写法是合规的(category必填,subcategory和property可选) - 如果需要生成AMP页面的Url,可以给Action的
[Route]特性加上Name参数,比如[Route("{category}/{subcategory?}/{property?}", Name = "AmpSubPage")],之后用Url.RouteUrl("AmpSubPage", new { category = "books", subcategory = "fiction" })来生成Url
内容的提问来源于stack exchange,提问作者Marcus Ohlsson
相关产品推荐
相关产品推荐

