【问题标题】:Ajax gets correct response but not loading into pageAjax 得到正确响应但未加载到页面中
【发布时间】:2019-07-09 12:43:25
【问题描述】:

下面是我写的。检查开发工具,我可以看到响应中的 HTML 是正确的,只是它没有加载到页面中。控制台中没有出现错误。

$('#manufacturerDropDown').change(function () {
    var selected = $(this).val();
    $.ajax({
        url: '/Home/Index',
        data: { id: $('#manufacturerDropDown option:selected').val() },
        type: "post",
        cache: false,
        success: function (data) {
            alert(data);
            var modelDropDown = $('#modelDropDown');
            modelDropDown.empty();

            $(modelDropDown).each(function (index, item) {
                modelDropDown.append(
                    $('<option>', {
                        value: item.value,
                        text: item.text
                    }));
            });
        },
        error: function () {
            alert(xhr.status);
            alert(thrownError);
        }
    });
});

我错过了什么?

编辑:

这是响应 HTML,我省略了页眉和页脚:

<form method="post">
    <div class="container">
        <div class="row pt-3">
            <div class="col border bg-light pt-4">
                <div class="form-group row">
                    <label class="col-sm-5 col-form-label text-right" for="ManufacturerId">Manufacturers</label>
                    <div class="col-sm-7">
                        <select class="form-control form-control-sm w-50" id="manufacturerDropDown" value="ManufacturerId" data-val="true" data-val-required="The ManufacturerId field is required." name="ManufacturerId">
                            <option value="217ca128-b8b8-e311-b74d-005056b12c30">F</option>
                            <option value="227ca128-b8b8-e311-b74d-005056b12c30">Audi</option>
                            <option value="237ca128-b8b8-e311-b74d-005056b12c30">BMW</option>
                            <option value="247ca128-b8b8-e311-b74d-005056b12c30">Ford</option>
                            <option value="257ca128-b8b8-e311-b74d-005056b12c30">Mazda</option>
                            <option value="267ca128-b8b8-e311-b74d-005056b12c30">Peugeot</option>
                            <option value="277ca128-b8b8-e311-b74d-005056b12c30">Mercedes</option>
                        </select>
                        <span class="text-danger field-validation-valid" data-valmsg-for="ManufacturerId" data-valmsg-replace="true"></span>
                    </div>
                </div>
                <div class="form-group row">
                    <label class="col-sm-5 col-form-label text-right" for="ModelId">Models</label>
                    <div class="col-sm-7">
                        <select class="form-control form-control-sm w-50" id="modelDropDown" data-val="true" data-val-required="The ModelId field is required." name="ModelId">
                            <option value="e336de76-90b9-e311-b74d-005056b12c30">Focus</option>
                        </select>
                        <span class="text-danger field-validation-valid" data-valmsg-for="ModelId" data-valmsg-replace="true"></span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</form>

这是控制器的代码:

public IActionResult Index(string id)
{
    Guid selectedId = Guid.Parse(id);

    var vm = new HomeViewModel
    {
        Manufacturers = context.ManufacturersTable.OrderBy(x => x.Manufacturer).ToList(),
        Models = context.ModelsTable.OrderBy(x => x.ModelName).Where(x => x.ManufacturerId == selectedId).ToList(),
    }
}

【问题讨论】:

  • 可以添加数据示例吗?
  • 你是 each() 没有意义。您正在循环遍历 jQuery 查找的结果,这是一个 id,因此只有一个元素,并尝试使用来自自身的数据来更改自身。你永远不会使用data
  • 问题不是你的ajax,而是你在追加数据时的jquery。做一个最小版本的代码,只是将数据附加到你想要它去的地方
  • 你的问题和这个stackoverflow.com/questions/41343215/…类似

标签: jquery asp.net ajax asp.net-mvc


【解决方案1】:

尝试一些这样的想法:

success: function (data) {
            alert(data);
            var modelDropDown = $('#modelDropDown');
            var html="";
            for(var i=0; i<data.length; i++){
                   html+="<option value='"+data[i].value+"'>"+data[i].text+"</option>";
             }
             modelDropDown.html(html);
        }

【讨论】:

    【解决方案2】:

    将for循环改为

           for (item in data.Models) { /// or data.property in which actual data is 
             modelDropDown.append(
                    $('<option>', {
                        value: item.value,
                        text: item.text
                    }));
               }
    

    更新

    在控制器中

    public IActionResult Index(string id)
       {
         Guid selectedId = Guid.Parse(id);
    
    var vm = new HomeViewModel
    {
        Manufacturers = context.ManufacturersTable.OrderBy(x => 
         x.Manufacturer).ToList(),
        Models = context.ModelsTable.OrderBy(x => x.ModelName).Where(x => 
        x.ManufacturerId == selectedId).ToList(),
       }
    
      return vm;
    }
    

    【讨论】:

    • 这会生成大约 20k 的空白选项,所以我开始怀疑是否还有其他问题!
    • @FullerPrime 如果您添加数据示例,我可能会更有帮助
    • 它们是由 SQL 表使用 Lists 填充的下拉列表,你是这个意思吗?
    • @FullerPrime 代替 alert(data),使用 console.log(data),看看你在控制台得到了什么并发布问题
    • 虽然可能值得一提的是正确的 html 也在那里,但它只是没有在页面上呈现。
    【解决方案3】:

    在 ajax 成功回调中,您正在迭代下拉选择器。您应该迭代响应数据:

    $('#manufacturerDropDown').change(function () {
        var selected = $(this).val();
        $.ajax({
            url: '/Home/Index',
            data: { id: $('#manufacturerDropDown option:selected').val() },
            type: "post",
            cache: false,
            success: function (data) {
                alert(data);
                var modelDropDown = $('#modelDropDown');
                modelDropDown.empty();
    
                data.forEach(function (item) {
                    modelDropDown.append(
                        $('<option>', {
                            value: item.value,
                            text: item.text
                        }));
                });
            },
            error: function () {
                alert(xhr.status);
                alert(thrownError);
            }
        });
    }); 
    

    【讨论】:

    • 我得到 forEach 不是这个函数,可能是因为数据类型?
    • 什么意思?我正在使用 JavaScript 数组 forEach 方法,因为我假设您在响应中得到的是一个数组。这个假设不正确吗?在那种情况下,你从 ajax 响应中得到了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多