You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:12:34