252 votes

Argument de postback ou de callback non valide. La validation des événements est activée en utilisant '<pages enableEventValidation="true"/>'.

J'obtiens l'erreur suivante lorsque je renvoie une page du côté client. J'ai du code JavaScript qui modifie une asp:ListBox du côté client.

Comment réparer cela ?

Détails de l'erreur ci-dessous :

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

0 votes

N'effectuez pas de databind dans l'événement page_load.

190voto

Jeff Pang Points 581

Avez-vous des codes dans vos événements Page_Load ? Si oui, peut-être que l'ajout de ce qui suit vous aidera.

if (!Page.IsPostBack)
{ //do something }

Cette erreur se produit lorsque vous cliquez sur votre commande et que le Page_load est relancé. Dans un cycle de vie normal, il s'agit de Page_Load -> Cliquez sur la commande -> Page_Load (à nouveau) -> Traitement de l'événement ItemCommand.

8 votes

aha!Merci beaucoup, c'était le truc dans mon cas ! J'ai rechargé une liste déroulante dans le pageload, et donc le framework a perdu le contrôle des éléments (les nouveaux) dans le ddl, et celui sur lequel j'ai cliqué (qui n'existait plus).

0 votes

J'avais la même erreur que l'OP... J'utilisais un assistant dans mon formulaire et j'appelais l'étape 0 dans mon chargement de page. J'ai supprimé cela et le problème a disparu. Merci...

0 votes

Merci beaucoup pour cette réponse.... J'ai eu le même problème et il s'est avéré que j'avais juste oublié d'ignorer les postbacks lors du chargement des données dans ma grille... j'ai gagné beaucoup de temps.

179voto

norbertB Points 2689

Le problème est qu'ASP.NET n'a pas connaissance de cet élément de liste supplémentaire ou supprimé. Vous avez un certain nombre d'options (énumérées ci-dessous) :

  • Désactiver la validation des événements (mauvaise idée, car vous perdez un peu de la sécurité qui vient avec un coût très faible).
  • Utilisez ASP.NET Ajax UpdatePanel. (Placez la boîte de liste dans le panneau de mise à jour et déclenchez une mise à jour si vous ajoutez ou supprimez la boîte de liste. De cette façon, l'état de la vue et les champs connexes seront mis à jour et la validation des événements passera).
  • Oubliez le côté client et utilisez le postback classique pour ajouter ou supprimer les éléments de la liste côté serveur.

J'espère que cela vous aidera.

0 votes

Une autre option : implémenter IPostBackEventHandler et appeler js __doPostBack('<%= UniqueId.ToString() %>',arg)

0 votes

Sur la base des suggestions ci-dessus, j'ai placé mes listes déroulantes dans un asp:UpdatePanel ASP.NET ordinaire, j'ai chargé les listes déroulantes dans le code derrière et ensuite upNewRecord.Update() ;

41voto

J'ai eu une expérience avec DataGrid. L'une de ses colonnes comportait un bouton "Select". Lorsque j'ai cliqué sur le bouton "Select" d'une ligne, j'ai reçu ce message d'erreur :

"Argument de postback ou de callback non valide. La validation des événements est activée en utilisant dans la configuration ou <%@ Page EnableEventValidation="true" %> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie que les arguments des événements postback ou callback proviennent du contrôle de serveur qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez la fonction ClientScriptManager.RegisterForEventValidation afin d'enregistrer les données de postback ou de callback pour validation."

J'ai changé plusieurs codes, et finalement j'ai réussi. Mon parcours d'expérience :

1) J'ai changé l'attribut de la page en EnableEventValidation="false" . Mais ça n'a pas marché. (non seulement c'est dangereux pour des raisons de sécurité, mon gestionnaire d'événement n'a pas été appelé : void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) J'ai mis en œuvre ClientScript.RegisterForEventValidation dans la méthode de rendu. Mais ça n'a pas marché.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3) J'ai changé le type de bouton dans la colonne de la grille, qui est passé de PushButton à LinkButton . Ça a marché ! ("ButtonType="LinkButton"). Je pense que si vous pouvez changer votre bouton en d'autres contrôles comme "LinkButton" dans d'autres cas, cela fonctionnerait correctement.

28voto

Andy C. Points 596

Vous allez vraiment vouloir faire 2 ou 3, ne désactivez pas la validation des événements.

L'ajout d'éléments à une asp:listbox côté client pose deux problèmes principaux.

  • La première est qu'elle interfère avec la validation des événements. Ce qui revient au serveur n'est pas ce qu'il a envoyé.

  • La seconde est que, même si vous désactivez la validation des événements, lorsque votre page est renvoyée, les éléments de la liste déroulante sont reconstruits à partir de l'état de la vue, de sorte que toutes les modifications apportées sur le client sont perdues. La raison en est qu'asp.net ne s'attend pas à ce que le contenu d'une zone de liste soit modifié sur le client, il s'attend seulement à ce qu'une sélection soit effectuée, et il ignore donc toutes les modifications que vous avez pu faire.

La meilleure option est probablement d'utiliser un panneau de mise à jour comme cela a été recommandé. Une autre option, si vous avez vraiment besoin d'effectuer cette opération côté client, est d'utiliser un bon vieux fichier <select> au lieu d'un <asp:ListBox> et de conserver votre liste d'articles dans un champ caché. Lorsque la page s'affiche sur le client, vous pouvez la remplir à partir d'une partie du contenu de votre champ de texte.

Ensuite, lorsque vous êtes prêt à l'afficher, vous remplissez à nouveau le contenu du champ caché à partir de la version modifiée de l'article. <select> . Ensuite, bien sûr, vous devez à nouveau diviser le tout sur le serveur et faire quelque chose avec vos articles, puisque votre sélection est vide maintenant qu'elle est de retour sur le serveur.

Dans l'ensemble, c'est une solution assez lourde que je ne recommanderais pas vraiment, mais si vous devez vraiment modifier une listBox côté client, cela fonctionne. Cependant, je vous recommande vraiment de vous pencher sur un updatePanel avant d'emprunter cette voie.

3 votes

c, vous n'avez pas besoin de garder les éléments sélectionnés dans un champ caché, si vous faites en sorte que la boîte de sélection runat="server" vous pouvez lire la valeur renvoyée par Request.Form[ selectid .UnqiueID]. Et si plusieurs sont sélectionnés, le navigateur affiche les valeurs au format csv. Notez que les propriétés items et selectedindex du contrôle seront fausses sur le serveur puisque vous avez modifié l'itrmlist sur le client, ce que le serveur ne sait pas.

0 votes

Michael, cela a fonctionné. Tant que vous ajoutez "multiple=true" sinon cela ne vous donnera qu'une seule valeur. Merci

1 votes

J'ai eu le même problème pour une liste déroulante avec des caractères de nouvelle ligne. Le passage à une sélection a parfaitement fonctionné. Merci.

19voto

biggles Points 68

Aucune des propositions ci-dessus n'a fonctionné pour moi. Après avoir creusé davantage, j'ai réalisé que j'avais négligé deux formulaires appliqués sur la page, ce qui causait le problème.

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

Sachez que récemment, ASP.NET a commencé à considérer les iframes à l'intérieur d'une balise de formulaire qui contient une balise de formulaire dans le document iframe lui-même comme un cadre imbriqué. J'ai dû déplacer l'iframe hors de la balise de formulaire pour éviter cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X