2016-10-04 66 views
0

我有一个下拉列表,它从模型中获取它的值并首先填充。点击该下拉列表,我使用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/>')) 
      }); 

     }); 

}); 
+0

你试图让下拉填充本身? – FailedUnitTest

+0

@FailedUnitTest我只用一个值填充下拉列表。当有人在下拉菜单中出现问题时,我使用点击功能来填充剩下的内容。 – TheFallenOne

+0

鉴于提供的代码,描述的行为似乎是合理的。每次点击下拉列表时,单击的下拉列表将被清空并重新填充。这不是你想要的吗? – tpdietz

回答

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'); 
    ... 
0

这似乎是这样做的愚蠢的方式。您可以在没有与用户交互的情况下进行相同的贷款操作来填充下拉菜单。

如此说来,以解决您的解决方案只需添加一个全局变量

$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/>')) 
     }); 
    } 
    }); 
}); 
+0

如果有几个匹配$('。ddlValue')的元素,我相信这种类型的解决方案会变得复杂,因为您的布尔标志将失效。 – tpdietz

+0

我有同样的评论。当类ddlValue有多个字段时不起作用。 – TheFallenOne

+0

“我有一个下拉菜单,它从模型中获取它的值并首先填充。单击该下拉列表时,将其切换为一个ID,然后将其切换为单数。 – jacksonecac