回发后访问控制的动态数据

时间:2010-10-15 19:35:21

标签: c# asp.net jquery ajax

所以我有一个级联下拉列表,但使用列表框。当在第一个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的数据,以便我可以在点击事件中访问它?

2 个答案:

答案 0 :(得分:2)

你真的不能这样做(至少不容易)。这里的问题是ajax和asp.net表单并没有很好地混合在一起。我认为你有两种选择:

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

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

答案 1 :(得分:0)

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

Request.Form[lbAttendees.UniqueID]

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