C# 访问控制&x27;回发后的动态数据

C# 访问控制&x27;回发后的动态数据,c#,asp.net,jquery,ajax,C#,Asp.net,Jquery,Ajax,所以我有一个级联下拉列表,但使用列表框。当在第一个列表框中选择一个项目时,第二个列表框将根据第一个选择填充项目(这是使用jQuery AJAX调用完成的)。以下是我得到的: $('#<%= lbEvents.ClientID %>').change(function() { var selectedValues = $('#<%= lbEvents.ClientID %>').val(); var json = '{ events: [' + select

所以我有一个级联下拉列表,但使用列表框。当在第一个列表框中选择一个项目时,第二个列表框将根据第一个选择填充项目(这是使用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" />
$('#')。更改(函数(){
var selectedValues=$('#').val();
var json='{events:['+selectedValues.join(',')+']}';
$.ajax({
类型:“POST”,
url:'Default.aspx/populateAttendes',
数据:json,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:无人居住
});
});
功能已填充(响应){
var Attendes=响应。d;
var AttendesList=$(“#”);
AttendesList.children().remove();
$。每个(与会者、职能部门(){
AttendesList.append($(“”).val(此['Value']).html(此['Text']);
});
}
//在页面加载时填充
起初,我在按钮的click事件中遇到一个错误,因为LBAttendeers是动态加载的,所以我必须将EnableEventValidation设置为false

我现在没有收到错误,但是在按钮的点击事件中,我只能访问lbEvents中的数据,但不能访问LBAttendes中的数据;LBAttenders在单击事件中为空。我假设我需要在ViewState中存储来自LBAttenders的数据

如何在ViewState中存储来自LBAttenders的数据,以便在单击事件中访问它?

您不能真正做到这一点(至少不容易做到)。这里的问题是ajax和asp.net表单并没有很好地结合在一起。在我看来,你有两个选择:

  • 使用JavaScript钩住第二个列表框,然后使用AJAX和一些api(REST?)保存单击的项目。(基本上使第二个列表框100%启用AJAX。)这是一个艰难的解决方案——你必须处理大量的UI事件和用例,但如果你能让它工作起来,那就非常酷了

  • 添加一些在点击按钮时运行的JavaScript。此代码将把所选值写入一个隐藏的文本框。然后,服务器端代码可以从隐藏的文本框中读取值(逗号分隔)


您可以通过以下方式直接访问该控件的表单数据:

Request.Form[lbAttendees.UniqueID]

将包含所选选项的值的。在处理原始表单数据时,只能获取值,而不能获取文本或其他选项。

我使用了第二个选项,将所选值添加到隐藏字段中。谢谢