2010-10-15 43 views
0

所以我有一個級聯下拉列表,但使用列表框。當在第一個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。

我現在沒有得到錯誤,但在按鈕的單擊事件中,我只能訪問lbEvents中的數據,但不能訪問lbAttendees; lbAttendees在點擊事件中爲空。我假設我需要將來自lbAttendees的數據存儲在ViewState中。

如何將lbAttendees中的數據存儲在ViewState中,以便我可以在click事件中訪問它?

回答

2

你不能這樣做(至少不容易)。這裏的問題是,ajax和asp.net表單並沒有真正混合在一起。當我看到你,你有兩個選擇:

  • 鉤與JavaScript中的第2個列表框,然後用一些API使用AJAX來保存的物品,因爲他們點擊(REST?)。 (基本上使第二個列表框100%啓用AJAX。)這是一個很難的解決方案 - 你必須處理大量的UI事件和用例,但是如果你能夠使用它,那很酷。

  • 添加一些JavaScript,點擊按鈕時運行此代碼將選定的值寫入隱藏文本框。然後,您的服務器端代碼可以從隱藏文本框中讀取值(逗號分隔)。

+0

我使用第二個選項,將選定的值添加到隱藏字段。謝謝。 – Steven 2010-10-19 21:15:03

+0

很好的解決方案。謝謝 – 2012-03-22 10:48:29

0

您可以訪問表單數據進行對照直接,通過使用:

Request.Form[lbAttendees.UniqueID] 

將包含所選選項的值。在處理原始表單數據時,您只能獲取價值而不是文字或其他選項。