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

发布后MVC4项目中jQuery函数加载失败,无法访问JsonResult接口

解决MVC4发布后关联下拉列表AJAX请求失效的问题

你的问题核心是硬编码的AJAX请求URL在部署环境下无法正确指向控制器方法——本地运行时应用通常处于根路径,所以"/invoice/GETCompanyByID"能正常访问,但发布到服务器后,应用可能部署在虚拟目录下,这个硬编码的根路径就会指向错误地址(比如直接指向服务器域名路径,而非虚拟目录下的路径)。

核心解决方案:用MVC的Url.Action生成正确请求路径

不要直接硬写URL,而是让MVC根据路由规则和部署上下文自动生成正确路径,具体步骤如下:

  1. 在视图页面的<script>标签中,先通过@Url.Action生成控制器方法的正确URL并赋值给JS变量:
var getCompanyByIDUrl = '@Url.Action("GETCompanyByID", "Invoice")';
  1. 修改AJAX请求中的url参数,替换为上面生成的变量:
if ($("#Area").val() != "Please select") {
    var options = {};
    options.url = getCompanyByIDUrl; // 替换硬编码URL
    options.type = "POST";
    options.data = JSON.stringify({ stateid: $("#Area").val() });
    options.dataType = "json";
    options.contentType = "application/json";
    options.success = function (states) {
        $("#state").empty();
        $("#inv").empty();
        // 修复原循环的小问题:i <= states.length会导致最后一次取到undefined,改为i < states.length
        for (var i = 0; i < states.length; i++) {
            $("#state").append("<option value=" + states[i].Value + ">" + states[i].Text + "</option>")
        }
        $("#state").prop("disabled", false);
        $("#contract").val($("#state").val())
    };
    options.error = function (xhr) {
        // 控制台打印错误详情,方便排查
        console.log("请求错误:", xhr.responseText);
        alert("Error retrieving states!");
    };
    $.ajax(options);
} else {
    $("#state").empty();
    $("#state").prop("disabled", true);
}
$("#areaid").val($("#Area").val())

额外排查点

发布后还需确认以下内容,避免其他潜在问题:

  • 服务器应用池是否配置为**.NET Framework 4.0及以上**(MVC4依赖该版本);
  • Web.config发布版本中的数据库连接字符串是否正确(确保DAL能正常读取数据);
  • 用浏览器F12开发者工具的Network标签查看AJAX请求状态:404代表路径错误,500代表后端方法执行出错,可通过xhr.responseText获取错误详情。

代码优化建议

原JS代码可以更简洁易读,同时修复循环问题,优化后版本:

$("#Area").on("change", function() {
    var areaVal = $(this).val();
    $("#areaid").val(areaVal);

    if (areaVal === "Please select") {
        $("#state").empty().prop("disabled", true);
        $("#inv").empty();
        return;
    }

    $.ajax({
        url: '@Url.Action("GETCompanyByID", "Invoice")',
        type: "POST",
        data: JSON.stringify({ stateid: areaVal }),
        dataType: "json",
        contentType: "application/json",
        success: function(states) {
            $("#state").empty().prop("disabled", false);
            $("#inv").empty();
            
            $.each(states, function(_, item) {
                $("#state").append(`<option value="${item.Value}">${item.Text}</option>`);
            });
            
            $("#contract").val($("#state").val());
        },
        error: function(xhr) {
            console.error("获取数据失败:", xhr.responseText);
            alert("Error retrieving states!");
        }
    });
});

后端C#代码可保持不变,若启用了防伪验证,建议添加[ValidateAntiForgeryToken]特性,并在前端请求中携带防伪令牌:

[HttpPost]
// 启用防伪验证时添加该特性
// [ValidateAntiForgeryToken]
public JsonResult GETCompanyByID(int stateid) 
{
    var contractList = DAL.Get_All_Contract(stateid);
    return Json(new SelectList(contractList, "IDContract", "ContractNo"));
}

内容的提问来源于stack exchange,提问作者Miad BayaniRad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:37:56