【问题标题】:Ajax populate SelectList with Option GroupsAjax 使用选项组填充 SelectList
【发布时间】:2015-01-20 09:24:36
【问题描述】:

在使用 Ajax 填充带有选项组的 SelectList 时,我能得到一些帮助吗?

我已正确编码添加项目,但不确定如何添加选项组。

这是我的有效 Ajax 代码:

var category = $(this).val();

$.ajax({
    type: "POST",
    async: true,
    url: '/TestController/Test',
    data: {
        'category': category
    },
    dataType: "json",
    error: function () {

    },
    success: function (data) {
        $("#fileId").empty();

        $.each(data, function () {
            $("#fileId").append($("<option />").val(this.Value).text(this.Text));
        });
    }
});

这是被调用的函数:

public async Task<string> Test(string category)
{
    var items = new List<SelectListItem>();
    items.Add(new SelectListItem() { Value = "1", Text = "Item 1" });
    items.Add(new SelectListItem() { Value = "2", Text = "Item 2" });
    items.Add(new SelectListItem() { Value = "3", Text = "Item 3" });

    return new JavaScriptSerializer().Serialize(items);
}

我现在想将选项组添加到 SelectList。

这是我正在调用的新函数,带有选项组:

public async Task<string> Test(string category)
{
    var Group1 = new SelectListGroup() { Name = "Group 1" };
    var Group2 = new SelectListGroup() { Name = "Group 2" };

    var items = new List<SelectListItem>();
    items.Add(new SelectListItem() { Value = "1", Text = "Item 1", Group = Group1 });
    items.Add(new SelectListItem() { Value = "2", Text = "Item 2", Group = Group2 });
    items.Add(new SelectListItem() { Value = "3", Text = "Item 3", Group = Group2 });

    return new JavaScriptSerializer().Serialize(items);
}

如何以与第一个示例相同的方式填充 SelectList,但使用选项组?

提前致谢。

编辑

我需要将 Group 项目缩进与下图相同(忽略项目和组名称):

这是需要输出的正确 HTML 代码:

<optgroup label="Public">
<option value="1">Green - test.png</option>
<option value="3">Yellow - test.png</option>
</optgroup>
<optgroup label="User">
<option value="5">Yellow534x300.png</option>
</optgroup>
</select>

@Rory McCrossan:您的代码输出以下内容:

<optgroup label="Group 1"></optgroup><option value="1">Item 1</option><optgroup label="Group 2"></optgroup><option value="2">Item 2</option><option value="3">Item 3</option></select>

【问题讨论】:

    标签: jquery ajax asp.net-mvc-5 selectlist selectlistitem


    【解决方案1】:

    如果您存储了以前的组名,则可以在值更改时添加一个新组。像这样的:

    success: function(data) {
        $("#fileId").empty();
        var $prevGroup, prevGroupName;
        $.each(data, function () {
            if (prevGroupName != this.Group.Name) {
                $prevGroup = $('<optgroup />').prop('label', this.Group.Name).appendTo('#fileId');
            }
            $("<option />").val(this.Value).text(this.Text).appendTo($prevGroup);
            prevGroupName = this.Group.Name;
        });
    });
    

    Example fiddle

    【讨论】:

    • 你能看看我对缩进组项目的编辑吗?
    • 我已经复制了一些我需要的源代码。你输出的代码有点不同。
    • 谢谢。现在完美运行。
    【解决方案2】:

    您可以将数据分组,然后在标记中创建 optgroup:

    success: function (data) {
        var newData = {};
    
        $.each(data, function () {
            if (newData[this.Group.Name]) {
                newData[this.Group.Name].push(this);
            } else {
                newData[this.Group.Name] = [this];
            }
        });
        $("#fileId").empty();
        for (var item in newData) {
            var group = $("#fileId").append($("<optgroup label='" + item + "' />");
            $.each(newData[item], function () {
                group.append($("<option />").val(this.Value).text(this.Text));
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个,我只是清空 html under 语句并附加新的。

      var category = $(this).val();
      
      $.ajax({
          type: "POST",
          async: true,
          url: '/TestController/Test',
          data: {
              'category': category
          },
          dataType: "json",
          error: function () {
      
          },
          success: function (data) {
              $("select#fileId").html('');
      
              $.each(data, function () {
                  $("select#fileId").append('<option value="' + this.Value + '">'+this.Text+'</option>');
              });
          }
      });
      

      【讨论】:

      • 这是 OP 代码已经做的 ($("#fileId").empty()),而且您还没有按照 OP 的要求创建任何 optgroup 标记...?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多