2008-10-01 22 views
1

我有一個使用ASP> NET AJAX通過webservice填充的下拉列表。在JavaScript中的方法的成功回調,我通過一個循環填充下拉:使用ASP.NET AJAX填充列表後更新viewstate

function populateDropDown(dropdownId, list, enable, showCount) { 
    var dropdown = $get(dropdownId); 
    dropdown.options.length = 1;  
    for (var i = 0; i < list.length; i++) { 
     var opt = document.createElement("option"); 
     if (showCount) { 
      opt.text = list[i].Name + ' (' + list[i].ChildCount + ')'; 
     } else { 
      opt.text = list[i].Name; 
     } 
     opt.value = list[i].Name; 
     dropdown.options.add(opt); 
    } 
    dropdown.disabled = !enable;  
} 

然而,當我提交表單,該控件上,該控件的名單總是在回發空。我如何獲得填充列表數據以保持回傳?

編輯:也許我是來這個倒退。一個更好的問題可能是,如何從web服務填充下拉列表,而不必使用updatepanel,因爲它必須通過整個頁面生命週期?

回答

3

雖然我不確定它是如何做到的,但AJAX控件工具包中的CascadingDropDown確實支持這一點。

這是用來做它行:

AjaxControlToolkit.CascadingDropDownBehavior.callBaseMethod(this, 'set_ClientState', [ this._selectedValue+':::'+text ]); 

但最簡單的想法是把選擇的值到一個隱藏輸入字段的回發事件。

4

您需要爲此使用Request.Form - 您無法從客戶端即時加密ViewState - 它會打敗它的全部要點:)。

編輯:響應您的編輯:)頁面生命週期是讓您首先使用ViewState持久性的東西。控制樹是在那裏處理的,好吧,沒有任何東西可以繞過它。

Request.Form是一種完全可行的方式來實現這一點 - 它會告訴你選擇的價值。如果你想知道所有的值,你可以做一些類型的序列化到一個隱藏的控制。

醜,是的,但這就是爲什麼上帝(有人稱他爲ScottGu)發明了ASP.NET MVC :)。

+0

是的,我希望我可以使用MVC!我已使用隱藏字段選項,使用Page.ClientScript.RegisterHiddenField進行設置。我創建了一個繼承自Dropdownlist的類,該類重寫了要從Request.Form加載的SelectedValue – 2008-10-01 05:44:46