所以我有一个级联下拉列表,但使用列表框。当在第一个ListBox中选择一个项目时,第二个ListBox将根据第一个选择填充项目(这是使用jQuery AJAX调用完成的)。这就是我得到的:
$('#<%= lbEvents.ClientID %>').change(function() {
var selectedValues = $('#<%= lbEvents.ClientID %>').val();
var json = '{ events: [' + selectedValues.join(',') + '] }';
$.ajax({
type: "POST",
url: 'Default.aspx/PopulateAttendees',
data: json,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: OnAttendeesPopulated
});
});
function OnAttendeesPopulated(response) {
var attendees = response.d;
var attendeesList = $("#<%= lbAttendees.ClientID %>");
attendeesList.children().remove();
$.each(attendees, function() {
attendeesList.append($("<option></option>").val(this['Value']).html(this['Text']));
});
}
//Populated on PageLoad
<asp:ListBox ID="lbEvents" runat="server" SelectionMode="Multiple" />
<asp:ListBox ID="lbAttendees" runat="server" SelectionMode="Multiple" />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
首先,我在按钮的click事件上收到错误,因为lbAttendees是动态加载的,所以我不得不将EnableEventValidation设置为false。
我现在没有收到错误,但在按钮的click事件中,我只能访问lbEvents中的数据,但不能访问lbAttendees; lbAttendees在click事件中为空。我假设我需要在ViewState中存储来自lbAttendees的数据。
如何在ViewState中存储来自lbAttendees的数据,以便我可以在点击事件中访问它?
答案 0 :(得分:2)
你真的不能这样做(至少不容易)。这里的问题是ajax和asp.net表单并没有很好地混合在一起。我认为你有两种选择:
使用JavaScript挂钩到第二个列表框,然后使用AJAX和一些api(REST?)来保存点击它们的项目。 (基本上使第二个列表框100%启用了AJAX。)这是一个很难的解决方案 - 你必须处理大量的UI事件和用例,但是如果你让它工作的话会非常酷。
添加一些在单击按钮时运行的JavaScript,此代码会将所选值写入隐藏文本框。然后,您的服务器端代码可以从隐藏的文本框中读取值(以逗号分隔)。
答案 1 :(得分:0)
您可以使用以下方式直接访问该控件的表单数据:
Request.Form[lbAttendees.UniqueID]
包含所选选项的值。当您处理原始表单数据时,您将只能获得值而不是文本或其他选项。