Argument de publication ou de rappel non valide. La validation d'événement est activée à l'aide de '< pages enableEventValidation = “true” / >'

StackOverflow https://stackoverflow.com/questions/228969

Question

Le message d'erreur suivant s'affiche lorsque je poste une page à partir du côté client. J'ai du code JavaScript qui modifie un asp: ListBox côté client.

Comment pouvons-nous résoudre ce problème?

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
Était-ce utile?

La solution

Le problème est qu’ASP.NET n’est pas informé de cet élément de liste supplémentaire ou supprimé. Vous avez plusieurs options (listées ci-dessous):

  • Désactivez la validation d'événement (mauvaise idée, car vous perdez un peu de sécurité pour un coût minime).
  • Utilisez ASP.NET Ajax UpdatePanel. (Placez la zone de liste dans le panneau de mise à jour et déclenchez une mise à jour si vous ajoutez ou supprimez une liste. De cette manière, viewstate et les champs associés obtiendront les mises à jour et la validation de l'événement passera.)
  • Oubliez le côté client et utilisez la publication classique pour ajouter ou supprimer le côté serveur listitems.

J'espère que cela aide.

Autres conseils

Avez-vous des codes dans vos événements Page_Load? Si oui, alors peut-être en ajoutant ce qui suit aidera.

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

Cette erreur est générée lorsque vous cliquez sur votre commande et que le chargement de chargement est à nouveau exécuté. Dans un cycle de vie normal, Page_Load - > Cliquez sur Commande - > Page_Load (encore) - > Traiter l'événement ItemCommand

J'ai eu une expérience avec DataGrid. L’une de ses colonnes était " Select " bouton. Quand je cliquais sur "Sélectionner" bouton de n'importe quelle ligne que j'ai reçu ce message d'erreur:

  

" Argument de publication ou de rappel non valide. La validation d’événement 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 à poster ou       Les événements de rappel proviennent du contrôle serveur qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez le       ClientScriptManager.RegisterForEventValidation afin d’enregistrer les données de publication ou de rappel pour la validation. "

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

1) J'ai changé l'attribut de page en EnableEventValidation = "false" . Mais cela n'a pas fonctionné. (non seulement c'est dangereux    Pour des raisons de sécurité, mon gestionnaire d'événements n'a pas été appelé: void Grid_SelectedIndexChanged (expéditeur d'objet, EventArgs e)

2) J'ai implémenté ClientScript.RegisterForEventValidation dans la méthode de rendu. Mais cela n'a pas fonctionné.

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 mon bouton dans la colonne de grille de PushButton à LinkButton . Cela a fonctionné! ("ButtonType =" LinkButton "). Je pense que si vous pouvez remplacer votre bouton par d’autres contrôles tels que "LinkButton". dans d'autres cas, cela fonctionnerait correctement.

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

L'ajout d'éléments à un client asp: listbox pose deux problèmes principaux.

  • La première est que cela interfère avec la validation des événements. Ce qui est revenu sur le serveur n’est pas ce qu’il a envoyé.

  • La seconde est que même si vous désactivez la validation d'événement, lorsque votre page est postée, les éléments de la zone de liste sont reconstruits à partir de l'état de visualisation, de sorte que toutes les modifications apportées sur le client sont perdues. La raison en est qu’un asp.net ne s’attend pas à ce que le contenu d’une zone de liste soit modifié sur le client, il attend seulement une sélection, ce qui annule toutes les modifications que vous auriez apportées.

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 de faire ce côté client, est d’utiliser un ancien < sélectionnez > 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 renseigner à partir d'une partie du contenu de votre champ de texte.

Ensuite, lorsque vous êtes prêt à l'envoyer, vous remplissez à nouveau le contenu du champ masqué à partir de votre modifié> < > . Ensuite, bien sûr, vous devez diviser à nouveau sur le serveur et utiliser vos éléments, car votre sélection est vide car 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 réellement modifier le listBox côté client, cela fonctionne. Toutefois, je vous recommanderais vivement de consulter un updatePanel avant de suivre cette voie.

J'ai eu le même problème avec un répéteur parce que j'avais une page Web avec un contrôle Répéteur dans un site Web sur lequel EnableEventValidation était activé. Ce n'était pas bien. J'obtenais des exceptions invalides liées à la publication.

Ce qui a fonctionné pour moi a été de définir EnableViewState = "false". pour le répéteur. Les avantages sont qu’il est plus simple à utiliser: il suffit de désactiver la validation des événements pour le site Web ou la page Web, mais la portée est bien moindre que de désactiver la validation des événements.

Rien de ce qui précède n'a fonctionné pour moi. Après avoir approfondi mes recherches, j’ai réalisé que j’avais négligé deux formulaires appliqués sur la page à l’origine du 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é à prendre en compte les iframes dans une balise de formulaire contenant une balise de formulaire dans le document iframe lui-même, un cadre imbriqué. J'ai dû déplacer l'iframe de la balise de formulaire pour éviter cette erreur.

J'ai eu le même problème lors de la modification d'un ListBox à l'aide de JavaScript sur le client. Cela se produit lorsque vous ajoutez de nouveaux éléments à la ListBox à partir du client qui n'étaient pas présents lors du rendu de la page.

Le correctif que j'ai trouvé consiste à informer le système de validation d'événement de tous les éléments valides possibles pouvant être ajoutés à partir du client. Pour ce faire, vous remplacez Page.Render et appelez Page.ClientScript.RegisterForEventValidation pour chaque valeur que votre JavaScript pourrait ajouter à la zone de liste:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

Cela peut être un peu pénible si vous avez un grand nombre de valeurs potentiellement valides pour la zone de liste. Dans mon cas, je déplaçais des éléments entre deux ListBox - une contenant toutes les valeurs possibles et une autre initialement vide, mais remplie par un sous-ensemble des valeurs de la première en JavaScript lorsque l'utilisateur clique sur un bouton. Dans ce cas, il vous suffit de parcourir les éléments de la première liste et de les enregistrer dans la deuxième zone de liste:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}

Un autre moyen non mentionné ici est de sous-classer ListBox

Ie.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation désactive l'attribut System.Web.UI.SupportsEventValidation si vous le sous-classez, à moins que vous ne le rajoutiez explicitement, il n'appellera jamais la routine de validation. Cela fonctionne avec n’importe quel contrôle, et c’est le seul moyen que j’ai trouvé de "désactiver". contrôle par contrôle (par exemple, pas au niveau de la page).

  

3: j'ai changé le type de mon bouton dans la grille   colonne de " PushButton " à   "LinkButton". Ça a marché!   (" ButtonType = " LinkButton ") Je pense que si   vous pouvez changer votre bouton en autre   des contrôles tels que " LinkButton " en d'autre   cas, cela fonctionnerait correctement.

J'aimerais pouvoir vous voter, Amir (hélas, mon représentant est trop bas.) J'avais juste ce problème et le changer a fonctionné comme un champion sur ma grille. Juste un peu de côté, je pense que le code valide est le suivant: ButtonType = " Link "

Je suppose que cela est dû au fait que lorsque vous cliquez sur "modifier", votre modification devient "mettre à jour" et "annuler", puis de nouveau sur "modifier" lors de la soumission. Et ces contrôles changeants rendent .net mal à l'aise.

(1) EnableEventValidation = "false" ................... Cela ne fonctionne pas pour moi.

(2) ClientScript.RegisterForEventValidation .... Cela ne fonctionne pas pour moi.

Solution 1:

Modifiez Button / ImageButton en LinkButton dans GridView. Ça marche. (Mais j'aime bien ImageButton)

Recherche: Button / ImageButton et LinkButton utilisent différentes méthodes pour publier

Article d'origine:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264 .aspx

Solution 2:

Dans OnInit (), entrez le code à peu près comme ceci pour définir un ID unique pour Button / ImageButton:

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

Article d'origine:

http://www.c-sharpcorner.com/Forums/Thread/35301/

vous essayez quelque chose comme ça, dans votre page .aspx

ajouter

  

EnableEventValidation = " false "

vous êtes libre de poser n'importe quelle question!

Si vous remplissez la liste déroulante par le biais du script côté client, effacez la liste avant de renvoyer le formulaire au serveur; alors ASP.NET ne se plaindra pas et la sécurité sera toujours active.

Et pour obtenir les données sélectionnées à partir du DDL, vous pouvez associer un "OnChange". événement à la DDL pour collecter la valeur dans une entrée masquée ou dans une zone de texte avec Style = "display: none;"

J'ai implémenté une vue de grille imbriquée et j'ai rencontré le même problème. J'ai utilisé LinkButton au lieu d'un bouton d'image comme ceci:

avant j'avais une colonne comme celle-ci:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

J'ai remplacé comme ça.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 

J'avais un problème similaire, mais je n'utilisais pas ASP.Net 1.1 ni mettais à jour un contrôle via javascript. Mon problème ne s’est produit que sur Firefox et non sur IE (!).

J'ai ajouté des options à une liste DropDownList sur l'événement PreRender, comme suit:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

Mon "HF" (hiddenfield) avait les options séparées par la nouvelle ligne, comme ceci:

HF.value = "option 1\n\roption 2\n\roption 3";

Le problème était que la page HTML était cassée (je veux dire, il y avait de nouvelles lignes) sur les options de l'option "sélectionner". qui représentait le DropDown.

J'ai donc résolu mon problème en ajoutant une ligne:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

J'espère que cela aidera quelqu'un.

si vous remplacez UseSubmitBehavior = "True" par UseSubmitBehavior = "False" , votre problème sera résolu

.
<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

J'ai le même problème, ce que j'ai fait:

Vient d'ajouter une condition if (! IsPostBack) et tout fonctionne correctement:)

Cette erreur s'affichera sans publication

Ajouter le code:

If(!IsPostBack){

 //do something

}

Dans ce cas, ajoutez un identifiant au bouton dans RowDataBound de la grille. Cela résoudra votre problème.

Une solution simple à ce problème consiste à utiliser la vérification IsPostBack sur le chargement de votre page. Cela résoudra ce problème.

Ajax UpdatePanel le permet, et je pense que c'est le moyen le plus simple , ignorant la surcharge de Ajax .

Je sais que c'est un très vieux billet. En supposant que vous appeliez votre application, voici une idée qui a fonctionné pour moi:

  1. Implémentez ICallbackEventHandler sur votre page
  2. Appelez ClientScriptManager.GetCallbackEventReference pour appeler le code côté serveur
  3. Comme l'indique le message d'erreur, vous pouvez appeler ClientScriptManager.RegisterForEventValidation

Si vous n'avez pas besoin d'un contrôle total, vous pouvez utiliser un panneau de mise à jour qui le fera pour vous.

Nous avons rencontré le même problème lors de la conversion de nos pages ASPX classiques en pages de contenu.

La page présentant ce problème comportait une balise < / form > dans l'une des sections Contenu. Deux balises de fin de formulaire ont donc été affichées au moment de l'exécution, ce qui a provoqué ce problème. La suppression de la balise de fin de formulaire supplémentaire de la page a résolu ce problème.

Il y a quatre minutes, j'ai reçu la même erreur. Ensuite, j'ai recherché pendant une demi-heure comme vous. Dans tous les forums, ils disent généralement "ajouter une page enableEvent .. = false ou true". Toute solution proposée n'a pas résolu mes problèmes jusqu'à ce que je la trouve. Le problème est malheureusement un bouton ASP.NET. Je l'ai enlevé il y a deux secondes. J'ai essayé de remplacer par "imagebutton", mais c'était également inacceptable (car cela donnait la même erreur).

Enfin, j'ai remplacé par LinkButton . il semble fonctionner!

J'utilisais datalist et la même erreur se produisait pour mon bouton-poussoir. Je viens d'utiliser IsPostBack pour vérifier et remplir mes contrôles et le problème est résolu! Génial !!!

Ce qui a fonctionné pour moi est de déplacer le code suivant de page_load vers page_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

La meilleure option à faire est d'utiliser un champ caché et de ne pas désactiver la validation d'événement, mais aussi changer chaque liste, liste déroulante à sélectionner avec l'attribut serveur runat

Si vous utilisez le panneau de mise à jour Ajax. Ajoutez la balise < Triggers > et, à l'intérieur, déclencherez le bouton ou le contrôle à l'origine du postBack à l'aide de < asp: PostBackTrigger ... / >

Si vous connaissez dès le départ les données pouvant être renseignées, vous pouvez utiliser ClientScriptManager pour résoudre ce problème. Je rencontrais ce problème lorsque je remplissais de manière dynamique une liste déroulante à l'aide de javascript sur une sélection d'utilisateur antérieure.

Voici un exemple de code permettant de remplacer la méthode de rendu (en VB et C #) et de déclarer une valeur potentielle pour la liste déroulante ddCar.

En VB:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

ou une légère variation de C # pourrait être:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

Pour les débutants: cette option doit figurer dans le code derrière le fichier (.vb ou .cs) ou, si elle est utilisée dans le fichier aspx, vous pouvez insérer des balises < script > .

C’est la raison pour laquelle je l’obtenais:

J'ai eu un ASP: ListBox. Au début, c'était caché. Du côté du client, je le peuplerais via AJAX avec des options. L'utilisateur a choisi une option. Ensuite, en cliquant sur le bouton Soumettre, le serveur deviendrait très drôle avec le contrôle ListBox, car il ne se souvenait d’avoir aucune option.

Donc, ce que j’ai fait, c’est que j’ai effacé toutes les options de la liste avant de renvoyer le formulaire au serveur. De cette façon, le serveur ne s'est pas plaint puisque la liste est allée vide au client et qu'elle est revenue vide.

Trié !!!

Comme l'a dit Nick B et que cela a fonctionné pour moi, vous devez supprimer les sauts de ligne dans certains cas. Regardez le code:

- Mauvaise façon:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

-Voyage correct:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

Cela ne s'est produit que pour moi dans IE10 +

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top