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

Ajax获取正确响应却无法加载到页面,求问题排查

问题分析与解决方案

首先得说,你现在的核心问题是前端AJAX成功回调的逻辑完全没用到返回的HTML数据,而且后端返回的内容也不符合前端的预期,这就导致页面完全没更新。咱们一步步拆解:

问题根源

  1. 后端返回了完整HTML页面,但前端没利用它:你从/Home/Index拿到的是整个视图的HTML(包含页眉、页脚和两个下拉框),但你的前端代码却在遍历当前页面的#modelDropDown元素(一个select,遍历它只会循环一次),然后试图用这个DOM元素的item.value/item.text生成选项——这完全和返回的数据没关系,等于白做了。
  2. AJAX错误回调的参数缺失:原代码里error: function () { alert(xhr.status); alert(thrownError); }里的xhr和thrownError没作为参数传入,真出错了也会报错,只是你现在没触发到而已。

下面给你两种常用的修正方案,选哪种看你的需求:


方案一:后端返回JSON数据,前端动态生成选项

这种方式更轻量,适合只需要更新下拉框选项的场景

第一步:修改后端控制器

新建一个专门返回模型数据的Action(别复用Index,避免混淆):

public IActionResult GetModels(string id)
{
    Guid selectedId = Guid.Parse(id);
    // 只返回需要的选项值和文本,转成JSON格式
    var models = context.ModelsTable
                        .OrderBy(x => x.ModelName)
                        .Where(x => x.ManufacturerId == selectedId)
                        .Select(x => new 
                        { 
                            Value = x.ModelId.ToString(), // 假设ModelId是Guid,转成字符串给前端
                            Text = x.ModelName 
                        })
                        .ToList();
    return Json(models);
}

第二步:修改前端AJAX代码

调整请求地址,然后用返回的JSON数据生成下拉框选项:

$('#manufacturerDropDown').change(function () {
    var selectedId = $(this).val(); // 简化写法,直接拿当前选中值
    $.ajax({
        url: '/Home/GetModels', // 对应上面新建的Action
        data: { id: selectedId },
        type: "POST",
        cache: false,
        success: function (models) {
            var modelDropDown = $('#modelDropDown');
            modelDropDown.empty(); // 清空原有选项
            // 遍历返回的JSON数组,生成新选项
            $.each(models, function (index, item) {
                modelDropDown.append($('<option>', {
                    value: item.Value,
                    text: item.Text
                }));
            });
        },
        error: function (xhr, status, thrownError) { // 补上参数
            alert('请求出错:' + xhr.status + ' - ' + thrownError);
        }
    });
});

方案二:后端返回部分视图,前端直接替换DOM

如果希望后端帮你渲染好下拉框的HTML(比如要保留验证逻辑),可以用部分视图:

第一步:创建部分视图

新建一个名为_ModelDropDownPartial.cshtml的部分视图,内容只包含模型下拉框相关代码:

<select class="form-control form-control-sm w-50" id="modelDropDown" data-val="true" data-val-required="The ModelId field is required." name="ModelId">
    @foreach (var model in Model)
    {
        <option value="@model.ModelId.ToString()">@model.ModelName</option>
    }
</select>
<span class="text-danger field-validation-valid" data-valmsg-for="ModelId" data-valmsg-replace="true"></span>

第二步:修改后端控制器

新建Action返回这个部分视图:

public IActionResult GetModelDropDown(string id)
{
    Guid selectedId = Guid.Parse(id);
    var models = context.ModelsTable
                        .OrderBy(x => x.ModelName)
                        .Where(x => x.ManufacturerId == selectedId)
                        .ToList();
    return PartialView("_ModelDropDownPartial", models);
}

第三步:修改前端AJAX代码

把返回的HTML替换到页面中模型下拉框的容器里:

$('#manufacturerDropDown').change(function () {
    var selectedId = $(this).val();
    $.ajax({
        url: '/Home/GetModelDropDown',
        data: { id: selectedId },
        type: "POST",
        cache: false,
        success: function (html) {
            // 找到模型下拉框的父容器,替换里面的内容
            $('#modelDropDown').parent().html(html);
            // 动态生成的元素需要重新绑定验证
            $.validator.unobtrusive.parse('#modelDropDown');
        },
        error: function (xhr, status, thrownError) {
            alert('请求出错:' + xhr.status + ' - ' + thrownError);
        }
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:44:46