2015-10-07 1 views
1

Mon formulaire Web de test comporte 1 dropdownlist et 2 buttons. Voici:Page.EnableEventValidation = false ne reconnaît pas les nouvelles valeurs de liste déroulante

<form id="form1" runat="server"> 
    <asp:DropDownList ID="DropDownListTest" runat="server" > 
     <asp:ListItem>Value 0</asp:ListItem> 
     <asp:ListItem>Value 1</asp:ListItem> 
     <asp:ListItem>Value 2</asp:ListItem> 
    </asp:DropDownList> 

<asp:Button ID="ButtonClient" runat="server" Text="Button" OnClientClick="ChangeDropDown(); return false;" /> 

<asp:Button ID="ButtonServer" runat="server" Text="Server" onclick="ButtonServer_Click" /> 
</form> 

C'est la fonction javascriptChangeDropDown():

function ChangeDropDown() { 
     for (i = document.getElementById("<%=DropDownListTest.ClientID%>").options.length - 1; i >= 0; i--) { 
      document.getElementById("<%=DropDownListTest.ClientID%>").remove(i); 
     } 
     var opt = document.createElement("option"); 

     opt.text = "Complete"; 
     opt.value = "Complete"; 
     document.getElementById("<%=DropDownListTest.ClientID%>").options.add(opt); 


     var opt2 = document.createElement("option"); 
     opt2.text = "Not Complete"; 
     opt2.value = "Not Complete"; 
     document.getElementById("<%=DropDownListTest.ClientID%>").options.add(opt2); 
} 

Et c'est le codebehind:

protected void ButtonServer_Click(object sender, EventArgs e) 
    { 
     string val = this.DropDownListTest.SelectedValue; 
    } 
    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     Page.EnableEventValidation = false; 
     //"Invalid postback or callback argument" if I remove this. 
    } 

Disons que je clique sur button ButtonClient (qui modifie les valeurs de liste déroulante), sélectionnez "Terminer", puis cliquez sur ButtonServer. Dans codebehind, la valeur this.DropDownListTest.SelectedValue est égale à "Valeur 0" au lieu de "Complète".

Je comprends pourquoi j'obtiens le problème, mais existe-t-il une autre solution en plus d'ajouter les éléments codebehind?

Répondre

0

Vous ne pouvez pas obtenir la valeur de la manière standard car le serveur ne sait pas que les éléments ont été modifiés pour la liste déroulante.

Cependant, vous pouvez obtenir la valeur directement à partir de la demande:

protected void ButtonServer_Click(object sender, EventArgs e) 
{ 
    string val = Request[this.DropDownListTest.UniqueID]; 
} 
+0

Dans mon cas, cela fonctionne bien depuis 'value' et' Text' sont les mêmes. Mais que ferais-je si je voulais récupérer le 'Text' au lieu de' Value'? Merci. – rbhat

+0

Le 'Text' n'est pas publié sur le serveur. Si vous avez besoin du texte, vous pouvez soit: (1) reconstruire les éléments sur le serveur pour correspondre à la modification effectuée sur le client ou (2) utiliser des champs cachés pour stocker le texte du javascript et obtenir la valeur de ces champs masqués le serveur. – HashPsi