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

Select2 3.x下拉无结果问题排查(MVC C#环境)

排查Select2 3.x下拉无结果的问题

我来帮你一步步定位并解决这个问题,结合你的代码和描述,核心有几个关键问题需要修正:

1. 绑定元素类型错误:HiddenFor 不适合作为 Select2 的载体

Select2 3.x 是基于 <select> 元素构建的组件,你现在用 @Html.HiddenFor 生成的隐藏输入框并不是它预期的绑定目标。隐藏框无法渲染下拉选项的UI结构,这会导致即使数据请求成功,也看不到任何下拉结果。

修正方案:
把 HiddenFor 替换为空的 <select> 标签用于渲染Select2,同时保留隐藏字段存储选中的ID(如果需要回显或提交数据):

<div class="form-group">
    <label class="control-label col-sm-3">Item Number</label>
    <div class="col-sm-9">
        <!-- 空select用于Select2渲染下拉UI -->
        <select id="component-ajax" class="js-data-component-ajax form-control" placeholder="Component number"></select>
        <!-- 隐藏字段存储选中的ItemKey,用于表单提交 -->
        @Html.HiddenFor(m => m.NewProductBOMComponent.ItemKey)
    </div>
</div>

再添加一个事件监听,把Select2选中的ID同步到隐藏字段:

$('#component-ajax').on('select2:select', function(e) {
    var selectedData = e.params.data;
    $('#NewProductBOMComponent_ItemKey').val(selectedData.id);
});

2. JSON 格式不符合 Select2 3.x 的要求

你的后端返回的JSON结构有问题:

{"results":[{"17825":"550-02"},{"6495":"550-11"}],"pagination":{"more":false}}

Select2 3.x 要求每个结果对象必须包含 id(选项值)和 text(显示文本)两个固定属性,而你现在的对象是用数字作为键、编号作为值的结构,组件无法识别这些字段,自然无法渲染选项。

修正方案:
修改后端代码,把数据整理成符合要求的结构。比如在C#中用匿名类规范输出:

public JsonResult AjaxComponents(string search)
{
    // 假设FindComponents_jqs2返回的是Dictionary<int, string>类型
    var components = Services.FourthShiftItemService.FindComponents_jqs2(search)
        .Select(kv => new { id = kv.Key, text = kv.Value })
        .ToList();
    
    var response = new { 
        results = components, 
        pagination = new { more = false } 
    };
    return Json(response, JsonRequestBehavior.AllowGet);
}

这样返回的JSON会变成:

{"results":[{"id":17825,"text":"550-02"},{"id":6495,"text":"550-11"}],"pagination":{"more":false}}

3. JS 中 results 回调的重复包装问题

你的JS代码里,results回调把后端返回的obj又额外包装了一层{results: obj}:

results: function (obj, page) {
    alert('hi');
    return {results: obj};
}

但后端已经返回了包含results和pagination的完整响应对象,这样处理后,Select2实际拿到的结构会变成{results: {results: [...], pagination: {...}}},它找不到正确的结果数组。

修正方案:
直接返回后端的响应对象即可:

results: function (obj, page) {
    alert('hi');
    return obj;
}

额外验证点

  • 确认Select2 3.x的CSS和JS文件已经正确引入,没有和其他JS库(比如jQuery)版本冲突;
  • 检查浏览器Network面板,确认AjaxComponents接口返回的HTTP状态码是200,且JSON格式正确(可以直接预览响应内容);
  • 你的代码设置了minimumInputLength:2,测试时需要输入至少2个字符才会触发请求,确认测试操作符合这个条件。

把这些点修正后,Select2应该就能正常渲染下拉选项了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:17:30