2009-02-24 7 views
0

J'ai un formulaire de don qui contient un panneau de mise à jour qui contient une liste déroulante pour des montants prédéterminés plus l'option "Autre" "Lorsque" Autre "est sélectionné la liste déroulante a déclenché le partiel En dehors de ce panneau de mise à jour, j'ai un champs de formulaire de contrôle de serveur supplémentaires tels que des zones de texte et un bouton pour la soumission. autre » est sélectionné le bouton « onclick » événement ne parvient pas à tirer un postback completASP.NET: Button extérieur UpdatePanel ne réussit pas à PostBack

Exemple:.

<asp:UpdatePanel ID="updatePanelAmount" runat="server"> 
    <ContentTemplate> 
     <table style="width: 500px;"> 
     <tbody> 
     <tr> 
      <th style="width: 200px;"><asp:Label ID="lblAmount" runat="server" CssClass="required" Text="Donation Amount: " /></th> 
      <td> 
       <asp:DropDownList ID="selAmount" runat="server" /> 
       <asp:CustomValidator ID="valDonationAmount" runat="server" ControlToValidate="selAmount" ErrorMessage="Donation Amount" Display="None" /> 
      </td> 
     </tr> 
     </tbody> 
     </table>   
     <asp:Panel ID="panelOther" runat="server" Visible="false"> 
      <table style="width: 500px;"> 
      <tbody> 
      <tr> 
       <th style="width: 200px;"><asp:Label ID="lblOther" runat="server" Text="Other Amount: " /></th> 
       <td> 
        $<asp:TextBox ID="txtOther" runat="server" /> 
        <asp:RequiredFieldValidator ID="valOther" runat="server" ControlToValidate="txtOther" Display="None" ErrorMessage="Other Amount" Enabled="false" /> 
        <asp:RegularExpressionValidator ID="valOtherExpress" runat="server" ControlToValidate="txtOther" Display="None" ErrorMessage="Other Amount: Invalid" ValidationExpression="[1-9][0-9]+(\.[0-9]{2})?" Enabled="false" /> 
       </td> 
      </tr> 
      </tbody> 
      </table> 
     </asp:Panel>     
    </ContentTemplate>   
</asp:UpdatePanel>  
<ctl:CreditCardForm ID="ctlCreditCardForm" runat="server" /> 
<asp:Button ID="btnSubmit" runat="server" Text="Donate" /> 

EDIT: affichage du code-behind pourrait faire est plus facile pour tout le monde

public partial class _Default : System.Web.UI.Page 
{ 
    private ArrayList _donations; 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     valDonationAmount.ServerValidate += new ServerValidateEventHandler(valDonationAmount_ServerValidate);   
     selAmount.AutoPostBack = true; 
     selAmount.SelectedIndexChanged += new EventHandler(selAmount_SelectedIndexChanged); 
     updatePanelAmount.UpdateMode = UpdatePanelUpdateMode.Conditional; 
     updatePanelAmount.ChildrenAsTriggers = true; 
     btnSubmit.Click += new EventHandler(btnSubmit_Click); 
    } 

    void selAmount_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (selAmount.SelectedItem.Text == "Other") 
     { 
      panelOther.Visible = true; 
      valOther.Enabled = true; 
      valOtherExpress.Enabled = true; 
     } 
     else 
     { 
      panelOther.Visible = false; 
      valOther.Enabled = false; 
      valOtherExpress.Enabled = false; 
     } 
    } 

    void valDonationAmount_ServerValidate(object source, ServerValidateEventArgs args) 
    { 
     args.IsValid = true; 
     if (args.Value == "0") 
     { 
      args.IsValid = false; 
     } 
    } 

    void btnSubmit_Click(object sender, EventArgs e) 
    { 
     Page.Validate();     
     if (Page.IsValid) 
     { 

     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    {  
     _donations = new ArrayList(); 
     double[] donations = new double[] { 20.00, 50.00, 100.00, 250.00, 500.00 }; 
     _donations.AddRange(donations); 

     if (!IsPostBack) 
     { 
      foreach (Double d in _donations) 
      { 
       selAmount.Items.Add(new ListItem(String.Format("{0:c}", d), String.Format("{0:c}", d))); 
      } 
      selAmount.Items.Insert(0, new ListItem("Select Donation Amount","0")); 
      selAmount.Items.Add(new ListItem("Other", "Other")); 
     }   
    } 
} 
+0

J'ai regardé sous un autre exemple (http://stackoverflow.com/questions/180366/losing-button-click-events -after-first-partial-postback-in-updatepanel) que le réglage "btnSubmit.UseSubmitBehavior = false" est supposé résoudre le problème. Je ne trouve pas que c'est le cas. –

+0

Je continue de le tester et de trouver quelque chose d'intéressant. Lorsque le panneau de mise à jour affiche depuis la liste déroulante "Autre", je clique sur le bouton pour observer les requêtes déclenchées avec FireBug et rien. Mais, quand je donne une valeur à txtOther, je reçois une publication. Je ne comprends pas ça. Quelqu'un sait? –

+0

Ce dernier commentaire semble vraiment bizarre. Cela pourrait-il être un bug de navigateur, peut-être? Quel navigateur utilisez-vous? Avez-vous essayé dans d'autres? Aussi, quel comportement obtenez-vous si vous vous débarrassez du UpdatePanel (c'est-à-dire faites tout en pleine publication)? – teedyay

Répondre

1

Est-ce que ce peut être un validateur vous bloquant? Votre bouton est-il censé ignorer les validateurs? Si c'est le cas, vous devez définir CausesValidation = "false" sur le bouton afin qu'il se déclenche même si les validateurs dans le panneau ne sont pas valides. Dans le cas contraire, l'événement de clic du bouton sera arrêté par les validateurs dans le panneau.

+0

Oui! Cela expliquerait que je puisse faire ce qui suit: $ ('# <% = btnSubmit.ClientID%>'). Click (function() { __doPostBack ('<% = btnSubmit.UniqueID%>', '') ; }); Il doit s'agir d'un script côté client empêchant la publication. –

+0

Merci beaucoup. Je voulais savoir pourquoi au lieu d'utiliser la solution de contournement.Je devrais de tracée à travers le JS généré plus. Aurait pu trouver la réponse. –

-3

Vérifiez la propriété AutoPostBack du contrôle Button. Réglez-le sur "True".

+0

Les boutons sont AutoPostback par défaut. – tsilb

0

AJAX provoque un comportement funky avec postbacks, session, etc.

<asp:Button ID="btnSubmit" runat="server" Text="Donate" onClick="btnSubmit_Click" /> 

Edit: Essayez aussi ceci: Assurez-vous que votre fil n'est pas dans un "si (IsPostBack!)" Bloc.

+0

J'ai essayé. Désolé pas d'aller. –

0

Placez le code ci-dessous en dehors de votre panneau de mise à jour.

<%--dummy validator to make ajax validation possible--%> 
     <asp:RequiredFieldValidator runat="server" CssClass="hidden" ControlToValidate="dummyTextBox" ValidationGroup="dummy"></asp:RequiredFieldValidator> 
     <asp:TextBox runat="server" ID="dummyTextBox" CssClass="hidden"></asp:TextBox> 

     <style> 
    .hidden { 
     display: none; 
    } 
    </style> 

lien ci-dessous a fonctionné pour moi ....

http://jeffreypaarhuis.com/2011/08/08/validation-not-working-in-updatepanel/

Questions connexes