MVC自定义路由导致Ajax调用失效,请求技术解决方案
问题分析与解决方案
这个问题的核心是路由匹配的顺序和规则冲突。你的ProductView路由定义在Default路由前面,当你发起/Product/ProductReviews的Ajax请求时,路由系统会优先匹配第一个符合格式的路由——也就是ProductView:
- 它会把
Product当成控制器(符合controller = "Product"的默认值), - 把
ProductReviews当成product_name参数, - 最后没有
id参数,所以用默认的UrlParameter.Optional。
结果就是请求被错误路由到了Product/View方法,而不是你期望的Product/ProductReviews。
解决方案1:给自定义路由添加约束,避免误匹配
修改ProductView路由,给id参数添加数字约束,确保只有当URL的最后一段是数字时,才匹配这个路由。这样非数字的路径(比如ProductReviews)就会跳过这个路由,走到Default路由:
routes.MapRoute( name: "ProductView", url: "product/{product_name}/{id}", defaults: new { controller = "Product", action = "View", product_name = UrlParameter.Optional, id = UrlParameter.Optional }, constraints: new { id = @"\d+" }, // 新增:id必须是数字格式 namespaces: new[] { "NoveltyApp.Controllers" } );
解决方案2:使用Url.Action生成正确的Ajax URL(推荐)
永远不要硬编码URL,而是利用ASP.NET MVC的Url.Action辅助方法生成符合路由规则的URL。这样不管路由怎么调整,都能保证请求地址正确:
修改你的Ajax脚本:
<script> function reviews() { $.ajax({ url: '@Url.Action("ProductReviews", "Product")', // 用辅助方法动态生成正确URL type: 'GET', success: function (data) { alert(data); } }); } </script>
解决方案3:调整路由顺序(不推荐)
如果你把Default路由放在ProductView前面,虽然Ajax请求能正常工作,但你的产品视图URL(/product/Camlin-Kokuyo-Acrylic-Color-Box---9ml-Tubes-1/1)会匹配不到ProductView路由,而是走到Default路由的Product/View方法(此时product_name会被当成action参数,完全不符合预期),所以这个方法不建议使用。
内容的提问来源于stack exchange,提问作者CHIRAG SUDRA
相关产品推荐
相关产品推荐

