我有 2 个 asp DropDownList 控件。第一个值在页面加载时用服务器端的代码填充。当用户从第一个列表中选择一个项目时,我有一个 jquery ajax 方法来获取并填充第二个下拉列表的值。
function getSubtaksForDdl() {
var $adl_type = $("#<%=hfADL_Type.ClientID%>").val();
var $tt = $("#<%=ddlTaskType.ClientID%> option:selected").val();
$.ajax({
url: '../../Ajax/answers.asmx/getSubTasks',
cache: false,
type: 'POST',
contentType: "application/json; charset=utf-8",
data: '{ _adl: "' + $adl_type + '", _task: "' + $tt + '"}',
dataType: 'json',
success: function (data) {
if (data.d != null) {
$("#<%=ddlSubtask.ClientID%>").prop("disabled", false);
$("#<%=ddlSubtask.ClientID%>").empty();
$.each(data.d, function (key, value) {
$("#<%=ddlSubtask.ClientID%>").append($("<option></option>").val
(value.Sequence).html(value.SubTaskName));
});
}
}
});
};
这一切都很好。
问题是当您保存页面并且我尝试获取代码隐藏中的 ddlSubtask 下拉列表的 SelectedValue 时,它始终为空 ("")。
if (!String.IsNullOrEmpty(ddlSubtask.SelectedValue)) {
carePlanADL.SubTaskType = Convert.ToInt32(ddlSubtask.SelectedValue);
}
我的页面有 EnableEventValidation="false"。如果我把它拿出来,那么我会得到“无效的回发或回调参数......按顺序使用 ClientScriptManager.RegisterForEventValidation 方法 注册回发或回调数据以进行验证。”
这是我缺少的东西吗?我需要做什么才能让代码隐藏来识别已选择列表项。
更新:
直到我弄清楚如何以正确的方式做到这一点或有人回答,我发现所选值位于 ViewState 中,我可以像这样访问它
var value = HttpContext.Current.Request.Form["ctl00$MainContent$ddlSubtask"];
此时我可以在 save 方法中将其保存回数据库。
现在的另一个问题是这个键每次都会改变,即,我发布网站并部署到生产环境,ddlSubtask 下拉列表的键会有所不同吗?...在这种情况下,这个临时解决方案根本就不是解决方案。
最佳答案
无法获取第二个下拉服务器端的值, 因为您将数据绑定(bind)到下拉客户端,而服务器对此一无所知。服务器仍然认为下拉列表为空。
根据 OP,可以通过检查 HttpContext.Current.Request.Form 属性来检索该值。
var value = HttpContext.Current.Request.Form["[unique ID of control]"];
第二个选项是将所选值存储在隐藏字段中,并从隐藏控制服务器端读取该值。
关于jquery - ASP :dropdown that is populated with jquery ajax doesnt pass selected value to server side when saving form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058840/