2010-06-21 7 views
0

Configuration
Utilisation de Visual Web Developer 2010 Express.
Langue: C#.
Cible Framework: .NET Framework 4.
ViewState: J'ai désactivé ViewState dans le Web.Config - c'est-à-dire <configuration><system.web><pages enableViewState="false" />.ASP.NET DropDownList.SelectedValue n'a pas de valeur sur PostBack avec liaison de données dynamique

Problème
J'ai une page ASP.NET avec un contrôle DropDownList standard.
J'ai défini EnableViewState = "true" et ViewStateMode = "Enabled" dans DropDownList.
J'utilise la liaison de données dans le code-behind pour remplir le contrôle (cela fonctionne très bien).
La liaison de données se produit dans un appel de Page_PreRender, à la fois lors de la charge initiale et de la publication.
Dans un appel d'un gestionnaire d'événements Button Click (c'est-à-dire avant le Page_PreRender), j'essaie de lire à partir de la propriété SelectedValue de DropDownList.
Le problème est: tout ce que je reçois jamais est une valeur de chaîne de longueur zéro ("") et l'inspection de l'objet indique que le contrôle contient des valeurs.

Solution
EnableViewState Assurez = "true" est définie dans la directive <% @ Page%> sur la page contenant le DropDownList.

Vous pouvez également créer une méthode d'extension pour DropDownList qui lit la valeur de la collection HttpRequest.
par exemple.

public static string GetSelectedValue(this System.Web.UI.WebControls.DropDownList listBox) 
{ 
    return HttpContext.Current.Request[listBox.ClientID]; 
} 
+1

En ce qui concerne la solution de méthode d'extension: Cela échouera (la valeur .ClientID est incorrecte) lorsque DropDownList est dans un UserControl personnalisé, que dans web.config soit défini ou pas. Motif: clientIDMode est une cause (il modifie la valeur sans inclure l'ID UserControl). Cependant, lorsque clientIDMode n'est pas "Static", le nom/clé de contrôle de DropDownList dans la collection Request utilise un séparateur "$" alors que .ClientID pour le contrôle renvoie "_". La solution consiste à utiliser la propriété .UniqueID de DropDownList. –

+0

J'ai également testé cela sous Visual Studio 2008 et .NET 3.5. Le même problème est survenu lors de l'exclusion de EnableViewState dans la directive @Page. –

Répondre

0

vous avez raison (en dehors de UniqueID comme Jason a fait remarquer)

mais pourquoi vous désactivez viewstate globalement? C'est l'un des grands avantages de asp.net et nécessaire pour beaucoup de fonctionnalités dans vos pages. Ce n'est pas si mal pour la plupart des contrôles donc pas de raison de le craindre.

Vous voulez garder un œil sur les contrôles qui génèrent beaucoup de balisage (comme les grilles) et définitivement le désactiver sur ceux-ci. Il suffit d'activer Trace dans votre directive Page, et vous verrez combien viewstate est utilisé par chaque nœud de votre arbre de contrôle.

+0

RE désactivation de ViewState - c'est une combinaison de facteurs mais surtout de préférences personnelles. Je me suis développé depuis avant que ViewState ne soit là et préfère toujours travailler près du métal et sans "magie". Je préfère aussi une approche «additive» au développement (ajouter au besoin) plutôt que réductive (enlever au besoin). –