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

如何通过JavaScript Ajax为ASP.NET Core SelectList设置下拉选项

动态联动州和城市下拉框解决方案

问题背景

表单中有州和城市两个下拉框,已实现选择州后通过AJAX获取对应城市数据,但不知道如何用JavaScript动态填充城市下拉框(错误地尝试操作服务器端的asp-items属性)。

现有代码回顾

视图中的下拉框结构

<div class="col-md-3 py-2">
    <label asp-for="@Model.Quote.CompanyState" class="form-label"></label>
    <select asp-for="@Model.Quote.CompanyState" asp-items="@Model.States" class="form-select">
        <option selected>Choose...</option>
    </select>
    <span asp-validation-for="@Model.Quote.CompanyState" class="text-danger"></span>
</div>
<div id="cityDDL" class="col-md-3 py-2" style="display:none;">
    <label asp-for="@Model.Quote.CompanyCity" class="form-label"></label>
    <select asp-for="@Model.Quote.CompanyCity" asp-items="@Model.Cities" class="form-select">
        <option selected>Choose...</option>
    </select>
    <span asp-validation-for="@Model.Quote.CompanyCity" class="text-danger"></span>
</div>

现有AJAX触发与请求代码

$('#Quote_CompanyState').on('change', function () {
    var state = $('#Quote_CompanyState Option:Selected').val();
    Quote.GetCitiesDropDown(state);
})

Quote.GetCitiesDropDown = function (state) {
    $.ajax({
        url: Global.basePath + 'Quote/GetCitiesDropDown',
        type: "POST",
        dataType: 'json',
        data: {state: state},
        cache: false,
        success: function (data) {
            console.log(data);
            $('#cityDDL').show();
        },
        error: function (xhr, status, error) {
            var err = JSON.parse(xhr.responseText);
            alert('Error: ' + err.quote_error[0]);
        },
        complete: function (data) {
        }
    });
}

现有控制器代码

[HttpPost]
public IActionResult GetCitiesDropDown(string state)
{
    var cities = _config.GetSection("CitiesByState").GetSection(state).Get<Dictionary<string, string>>();
    var citiesDDIs = cities.Select(city => new SelectListItem
    {
        Value = city.ToString(),
        Text = city.ToString()
    }).ToList();
    return Json(citiesDDIs);
}

解决步骤

1. 修正控制器中SelectListItem的生成逻辑

当前控制器生成的SelectListItem把字典键值对直接转成字符串,导致返回的value和text格式错误,需要分别取字典的Key和Value:

[HttpPost]
public IActionResult GetCitiesDropDown(string state)
{
    var cities = _config.GetSection("CitiesByState").GetSection(state).Get<Dictionary<string, string>>();
    var citiesDDIs = cities.Select(city => new SelectListItem
    {
        Value = city.Key,   // 用字典Key作为选项值
        Text = city.Value   // 用字典Value作为显示文本
    }).ToList();
    return Json(citiesDDIs);
}

2. 修改AJAX的Success回调,动态填充城市下拉框

asp-items是Razor服务器端渲染属性,前端无法直接修改,需要通过DOM操作直接更新下拉框选项:

success: function (data) {
    console.log(data);
    const citySelect = $('#Quote_CompanyCity');
    // 清空原有选项
    citySelect.empty();
    // 添加默认提示选项
    citySelect.append('<option selected>Choose...</option>');
    // 遍历返回的城市数据,逐个添加选项
    $.each(data, function(index, item) {
        citySelect.append(`<option value="${item.value}">${item.text}</option>`);
    });
    // 显示城市下拉框
    $('#cityDDL').show();
},

3. 优化联动逻辑(可选)

处理用户切换回默认州选项的情况,隐藏城市下拉框并清空选项:

$('#Quote_CompanyState').on('change', function () {
    var state = $(this).val();
    const cityDDL = $('#cityDDL');
    const citySelect = $('#Quote_CompanyCity');
    
    // 若选择默认选项,隐藏城市框并重置
    if (!state || state === 'Choose...') {
        cityDDL.hide();
        citySelect.empty().append('<option selected>Choose...</option>');
        return;
    }
    
    Quote.GetCitiesDropDown(state);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:40:39