Javascript 更改第一个下拉列表中的项时,下拉列表未在模式对话框中填充
单击jQuery数据表行中的“编辑”链接时,我正在打开一个引导模式对话框。使用行中某一列的“id”,使用ajax调用填充modal中的控件,以使用c#web服务从数据库获取数据 此模式包括两个下拉列表,其中第二个的内容由从第一个中选择的项目确定。当我填充第一个下拉列表并设置其所选值时,我可以看到第一个下拉列表的onchange()会触发。我还可以看到第二个下拉列表已正确填充。但设置第二个下拉菜单的选定值似乎没有效果。我不确定我错过了什么 以下是我所拥有的:Javascript 更改第一个下拉列表中的项时,下拉列表未在模式对话框中填充,javascript,c#,jquery,asp.net,modal-dialog,Javascript,C#,Jquery,Asp.net,Modal Dialog,单击jQuery数据表行中的“编辑”链接时,我正在打开一个引导模式对话框。使用行中某一列的“id”,使用ajax调用填充modal中的控件,以使用c#web服务从数据库获取数据 此模式包括两个下拉列表,其中第二个的内容由从第一个中选择的项目确定。当我填充第一个下拉列表并设置其所选值时,我可以看到第一个下拉列表的onchange()会触发。我还可以看到第二个下拉列表已正确填充。但设置第二个下拉菜单的选定值似乎没有效果。我不确定我错过了什么 以下是我所拥有的: <div class="moda
<div class="modal fade" id="editModal" role="dialog" aria-labelledby="editLabel" aria-hidden="true">
<div class="modal-dialog fade in ui-draggable">
<div class="modal-content">
... header stuff
<div class="modal-body">
<div class="row">
<div class="col-sm-3">
....
</div>
<div class="col-sm-4">
<div class="form-group">
<label for="ddlArea">Area</label>
<asp:DropDownList runat="server"
ID="ddlArea"
ClientIDMode="Static"
CssClass="form-control"
DataTextField="AreaName"
DataValueField="AreaID"
AppendDataBoundItems="true">
<asp:ListItem Text="Select Area" Value="-1" />
</asp:DropDownList>
</div>
</div>
<div class="col-sm-5">
<div class="form-group">
<label for="ddlDistrict">District</label>
<asp:DropDownList runat="server"
ID="ddlDistrict"
Enabled="false"
ClientIDMode="Static"
CssClass="form-control"
DataTextField="DistrictName"
DataValueField="DistrictID"
AppendDataBoundItems="true">
<asp:ListItem Text="Select District" Value="-1" />
</asp:DropDownList>
</div>
</div>
</div>
// When "Edit" link on a table row is clicked
function showEdit(MPOOID) {
$('#hfMPOOID').val(MPOOID);
$('#editModal').modal('show');
}
$(document).ready(function () {
$('#editModal').modal({
keyboard: true,
backdrop: "static",
show: false
}).on('show.bs.modal', function (e) {
var mpooID = $('#hfMPOOID').val();
//make ajax call to populate controls
populateMPOOEdit(mpooID);
});
});
function populateMPOOEdit(mpooID) {
var AreaID;
var DistrictID;
// Fist ajax call to populate controls, including Area drop down list and set its selected value
$.when(
$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: '<%= ResolveUrl("services/mpoo.asmx/GetMPOOListByMPOOID") %>',
cache: false,
data: JSON.stringify({ "MPOOID": mpooID }),
}).done(function (result) {
jResult = JSON.parse(result.d);
$.each(jResult, function (val, txt) {debugger
$('#tbMgrFN').val(txt.ManagerFirstName);
...
AreaID = txt.AreaID;
DistrictID = txt.DistrictID;
$("#ddlArea")[0].selectedIndex = 0;
$("#ddlDistrict")[0].selectedIndex = 0;
$("#ddlArea").val(AreaID);
$("#ddlDistrict").prop("disabled", false);
$('#ddlArea').change();
}).fail(function (jqXHR, textStatus, errorThrown) {
var errMsg = textStatus + ' - ' + errorThrown + '... Status: ' + jqXHR.status + ", ResponseText: " + jqXHR.responseText;
}),
// second ajax call, populate second drop down based on selected value of first drop down
$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: '<%= ResolveUrl("services/mpoo.asmx/GetDistrictsByAreaID") %>',
cache: false,
data: JSON.stringify({ "AreaID": areaID }),
}).done(function (result) {debugger
$("#ddlDistrict").empty().append($("<option></option>").val("-1").html("Select District"));
jResult = JSON.parse(result.d);
$.each(jResult, function (val, txt) {
$("#ddlDistrict").append($("<option></option>").val(null == txt.DistrictID ? '-1' : txt.DistrictID).html(txt.DistrictName));
});
}).fail(function (jqXHR, textStatus, errorThrown) {
var errMsg = textStatus + ' - ' + errorThrown + '... Status: ' + jqXHR.status + ", ResponseText: " + jqXHR.responseText;
})).done(function (a1, a2) {
// Set selected value of seond drop down -- does not work
$("#ddlDistrict").val(DistrictID);
});
}
... 标题材料
....
地区
地区
//单击表格行上的“编辑”链接时
函数showEdit(MPOID){
$('hfMPOOID').val(MPOOID);
$('editModal').modal('show');
}
$(文档).ready(函数(){
$('#editmodel').model({
键盘:没错,
背景:“静态”,
节目:假
}).on('show.bs.modal',函数(e){
var mpooID=$('#hfMPOOID').val();
//进行ajax调用以填充控件
populateMPOOEdit(mpooID);
});
});
函数populateMPOOEdit(mpooID){
面状变种;
区性变异;
//第一次ajax调用以填充控件,包括区域下拉列表并设置其选定值
美元。什么时候(
$.ajax({
类型:“POST”,
数据类型:“json”,
contentType:“应用程序/json;字符集=utf-8”,
url:“”,
cache:false,
数据:JSON.stringify({“mpood”:mpood}),
}).完成(功能(结果){
jResult=JSON.parse(result.d);
$.each(jResult,函数(val,txt){debugger
$('#tbMgrFN').val(txt.ManagerFirstName);
...
AreaID=txt.AreaID;
DistrictID=txt.DistrictID;
$(“#ddlArea”)[0]。选择的索引=0;
$(“#地区”)[0]。选择的索引=0;
$(“#ddlArea”).val(AreaID);
$(“#ddlddistrict”).prop(“disabled”,false);
$('#ddlArea').change();
}).fail(函数(jqXHR、textStatus、errorshown){
var errMsg=textStatus+'-'+errorshown+'…状态:'+jqXHR.Status+”,ResponseText:“+jqXHR.ResponseText;
}),
//第二个ajax调用,根据第一个下拉列表的选定值填充第二个下拉列表
$.ajax({
类型:“POST”,
数据类型:“json”,
contentType:“应用程序/json;字符集=utf-8”,
url:“”,
cache:false,
数据:JSON.stringify({“AreaID”:AreaID}),
}).done(函数(结果){debugger
$(“#ddlddistrict”).empty().append($(“”).val(“-1”).html(“选择地区”);
jResult=JSON.parse(result.d);
$.each(jResult,函数(val,txt){
$(“#ddlddistrict”).append($(“”).val(null==txt.DistrictID?'-1):txt.DistrictID.html(txt.DistrictName));
});
}).fail(函数(jqXHR、textStatus、errorshown){
var errMsg=textStatus+'-'+errorshown+'…状态:'+jqXHR.Status+”,ResponseText:“+jqXHR.ResponseText;
})).完成(功能(a1、a2){
//设置seond下拉列表的选定值--不起作用
$(“#地区”).val(地区ID);
});
}
这个版本的PopulatePooEdit函数对我来说很有用。正如我在问题中提到的,除了一些文本框外,模态对话框还有两个下拉列表。第二个下拉列表的内容取决于第一个下拉列表的选定值。因此,在填充控件时,我需要设置第一个下拉列表的选定值,然后进行s第二个ajax调用获取第二个下拉列表的内容,基于第一个下拉列表的选定值,并设置其选定值
解决方案是使用jQuery“when”(参见)
当我跟踪js代码时,似乎在“populateMPOOEdit()”函数中,“done”部分首先被执行,然后进入第二个下拉列表的onchange()在什么时候设置所选值已经太晚了。有什么办法解决这个问题吗?我更新了问题和上面的函数,添加了一个布尔变量来检查值是否存在于第二个下拉列表中,并且始终为false。任何jQuery专家都可以看到我在这里做错了什么。我只做了最后几根头发!我做了一些修改重新研究并认为我可以在组合两个ajax调用时使用jQuery$:一个用于填充常规控件(文本框,第一个下拉列表(ddlArea))并在第二次ajax调用中使用区域下拉列表的选定值来填充区域下拉列表。我当时认为我应该能够设置区域下拉列表的选定值,但仍然不走运。这是正确的方法吗?我基于此更新了问题。
function populateMPOOEdit(mpooID) {
var AreaID;
var DistrictID;
$.when(
// First ajax call to get set selected value of drop down 1
$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: '<%= ResolveUrl("services/mpoo.asmx/GetMPOOListByMPOOID") %>',
cache: false,
data: JSON.stringify({ "MPOOID": mpooID }),
}),
// Second ajax call to get the content of second drop down
$.ajax({
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
url: '<%= ResolveUrl("services/mpoo.asmx/GetDistrictsByAreaID") %>',
cache: false,
data: JSON.stringify({ "AreaID": areaID }),
})).done(function (a1, a2) {
// Now, set the values of each control
jResult = JSON.parse(a1[0].d);
$.each(jResult, function (val, txt) {
$('#tbMgrFN').val(txt.ManagerFirstName);
....
AreaID = txt.AreaID;
DistrictID = txt.DistrictID;
$("#ddlArea")[0].selectedIndex = 0;
$("#ddlDistrict")[0].selectedIndex = 0;
$("#ddlArea").val(AreaID);
$("#ddlDistrict").prop("disabled", false);
});
// Populate second drop down
$("#ddlDistrict").empty().append($("<option></option>").val("-1").html("Select District"));
jResult = JSON.parse(a2[0].d);
$.each(jResult, function (val, txt) {
$("#ddlDistrict").append($("<option></option>").val(null == txt.DistrictID ? '-1' : txt.DistrictID).html(txt.DistrictName));
});
// Set second drop down's selected value
$("#ddlDistrict").val(DistrictID);
});
}
$.when(
$.ajax({
....
}),
$.ajax({
....
}),
....
$.ajax({
....
}).done(function (a1, a2, ..., aN) {
var data1 = JSON.parse(a1[0].d);
var data2 = JSON.parse(a2[0].d);
....
var dataN = JSON.parse(aN[0].d);
})
});