2008-10-01 6 views
1

J'ai une liste déroulante qui est remplie via un service web en utilisant ASP> NET AJAX. Sur le rappel de succès de la méthode en javascript, je peuplant le menu déroulant via une boucle:Mise à jour de viewstate après le remplissage d'une liste avec ASP.NET AJAX

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;  
} 

Cependant lorsque je soumets la forme que ce contrôle est activé, la liste de contrôle est toujours vide sur postback. Comment faire pour que les données des listes remplies persistent pendant la publication?

Éditer: Peut-être que je viens à ce retour. Une meilleure question serait probablement, comment puis-je remplir une liste déroulante à partir d'un webservice sans avoir à utiliser un panneau de mise à jour en raison du cycle de vie complet de la page qu'il doit parcourir?

Répondre

3

Bien que je ne sois pas vraiment sûr de la façon dont cela fonctionne, le CascadingDropDown dans AJAX Control Toolkit prend en charge cette fonctionnalité.

Ceci est la ligne qui semble le faire:

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

Mais l'idée la plus simple serait de mettre la valeur sélectionnée dans un champ d'entrée cachée pour l'événement postback.

4

Vous devez utiliser Request.Form pour cela - vous ne pouvez pas crypter ViewState à la volée du client - il serait vaincre tout le point :). Edit: En réponse à votre Edit :) le cycle de vie de la page est la chose qui vous permet d'utiliser la persistance ViewState en premier lieu. L'arbre de contrôle y est géré et, bien, il n'y a tout simplement pas moyen de contourner le problème. Request.Form est un moyen parfaitement viable de faire cela - il vous dira la valeur de la sélection. Si vous voulez connaître toutes les valeurs, vous pouvez faire un certain type de sérialisation à un contrôle caché.

Laide, oui, mais c'est pourquoi Dieu (certains l'appellent ScottGu) a inventé ASP.NET MVC :).

+0

Oui, j'aimerais pouvoir utiliser MVC! Je suis allé avec l'option de champ caché, en utilisant Page.ClientScript.RegisterHiddenField pour le configurer. J'ai créé une classe qui hérite de Dropdownlist qui remplace la SelectedValue pour charger à partir de Request.Form –

Questions connexes