【问题标题】:Dropdown value not being retained下拉值未保留
【发布时间】:2016-10-04 17:05:31
【问题描述】:

我有一个下拉列表,它从模型中获取其值并首先填充。单击该下拉列表时,我使用 AJAX 填充其他值。我可以填充下拉列表,但是一旦我从下拉列表中选择一个选项,它就会重置为下拉列表中的第一个值。我想要的是在单击时填充一次下拉菜单,然后像普通下拉菜单一样工作。怎么设置条件?

这是使用定义的值'field.Value'初始设置下拉值的代码

ddlValue = "<option value="+field.Value+ " selected='selected'>" + field.Value+"</option>";

<td><select id='@String.Format("selValue{0}", field.Field)' class='ddlValue'>@Html.Raw(ddlValue)</select></td>

这是填充它的 AJAX 函数。

$('body').on('click', '.ddlValue', function () {
    var target = event.target.id;
    var rowId = $('#' + target).closest("tr").prop("id");
    var field = $('#' + rowId).find(".fieldvalue").html();

        $.ajax({
            cache: false,
            url: '@Url.Action("PopulateDropdown", "AdvancedSearch")',
            type: "POST",
            data: { Field: field }
        }).done(function (data) {

            var listb = $('#' + target);
            listb.empty();

            $.each(data.value, function (index, value) {
                listb.append($('<option>', {
                    value: value,
                    text: value
                }, '<option/>'))
            });

        });

});

【问题讨论】:

  • 您是否要让下拉列表自行填充?
  • @FailedUnitTest 我只用一个值填充下拉列表。当有人点击下拉菜单时,我使用点击功能来填充其余部分。
  • 鉴于提供的代码,所描述的行为似乎是合理的。每次单击下拉菜单时,单击的下拉菜单将被清空并重新填充。这不是你想要的吗?
  • 是的 @tpdietz 是正确的,每次单击选项时都会重新填充下拉列表,从而始终选择第一个值。我个人不喜欢在点击时填充下拉菜单的想法。为什么你在点击时填充它,你这样做是为了什么?为什么不从一开始就填充所有值?
  • 我同意@FailedUnitTest。尽管您的问题有解决方案,但我认为使用 ajax 填充单击下拉菜单有点粗略。如果接收响应需要 1 秒会发生什么?用户可能会感到困惑。无论如何,我祝你好运!

标签: javascript jquery ajax drop-down-menu


【解决方案1】:

如果您希望 ajax 填充只发生一次,则需要在事件侦听器发生后移除它。像这样:

$('.ddlValue').on('click', function () {

    $(this).off('click'); //This removes the event after it has happened once.

    var target = event.target.id;
    var rowId = $('#' + target).closest("tr").prop("id");
    var field = $('#' + rowId).find(".fieldvalue").html();

    $.ajax({
        cache: false,
        url: '@Url.Action("PopulateDropdown", "AdvancedSearch")',
        type: "POST",
        data: { Field: field }
    }).done(function (data) {

        var listb = $('#' + target);
        listb.empty();

        $.each(data.value, function (index, value) {
            listb.append($('<option>', {
                value: value,
                text: value
            }, '<option/>'))
        });

    });

});

请注意,以下操作将起作用:

$('body').on('click', '.ddlValue', function () {
    $(this).off('click');
    ...

【讨论】:

    【解决方案2】:

    这似乎是一种愚蠢的做法。您可以在贷款时执行相同的操作,而无需与用户进行任何交互来填充下拉列表。

    据说修复您的解决方案只需添加一个全局变量

    $first = true
    $('body').on('click', '.ddlValue', function () {
       if($first) {
          $first = false
          var target = event.target.id;
          var rowId = $('#' + target).closest("tr").prop("id");
          var field = $('#' + rowId).find(".fieldvalue").html();
          $.ajax({
             cache: false,
             url: '@Url.Action("PopulateDropdown", "AdvancedSearch")',
             type: "POST",
             data: { Field: field }
          }).done(function (data) {
             var listb = $('#' + target);
             listb.empty();
             $.each(data.value, function (index, value) {
             listb.append($('<option>', {
               value: value,
               text: value
             }, '<option/>'))
           });
         }
       });
    });
    

    【讨论】:

    • 我相信如果有几个元素匹配 $('.ddlValue'),这种类型的解决方案会变得复杂,因为你的布尔标志会过时。
    • 我也有同样的评论。当有多个具有 ddlValue 类的字段时不起作用。
    • “我有一个下拉列表,它从模型中获取其值并首先填充。单击该下拉列表”将其切换为 id,然后如果它是单数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多