发布后MVC4项目中jQuery函数加载失败,无法访问JsonResult接口
解决MVC4发布后关联下拉列表AJAX请求失效的问题
你的问题核心是硬编码的AJAX请求URL在部署环境下无法正确指向控制器方法——本地运行时应用通常处于根路径,所以"/invoice/GETCompanyByID"能正常访问,但发布到服务器后,应用可能部署在虚拟目录下,这个硬编码的根路径就会指向错误地址(比如直接指向服务器域名路径,而非虚拟目录下的路径)。
核心解决方案:用MVC的Url.Action生成正确请求路径
不要直接硬写URL,而是让MVC根据路由规则和部署上下文自动生成正确路径,具体步骤如下:
- 在视图页面的
<script>标签中,先通过@Url.Action生成控制器方法的正确URL并赋值给JS变量:
var getCompanyByIDUrl = '@Url.Action("GETCompanyByID", "Invoice")';
- 修改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
相关产品推荐
相关产品推荐

