Je reçois l’erreur suivante lorsque je publie une page du côté client. J’ai du code JavaScript qui modifie un asp: ListBox du côté client.
Comment réparons nous ça?
Détails de l’erreur ci-dessous:
Server Error in '/XXX' Application. -------------------------------------------------------------------------------- Invalid postback or callback argument. Event validation is enabled using in configuration or 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 in configuration or 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 in configuration or 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(Ssortingng uniqueId, Ssortingng argument) +2132728 System.Web.UI.Control.ValidateEvent(Ssortingng uniqueID, Ssortingng eventArgument) +108 System.Web.UI.WebControls.ListBox.LoadPostData(Ssortingng postDataKey, NameValueCollection postCollection) +274 System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(Ssortingng 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
Le problème est que ASP.NET ne connaît pas ce listitem supplémentaire ou supprimé. Vous avez un certain nombre d’options (listées ci-dessous):
J’espère que ça aide.
Avez-vous des codes dans vos événements Page_Load? Si oui, alors peut-être en ajoutant ce qui suit vous aidera.
if (!Page.IsPostBack) { //do something }
Cette erreur est renvoyée lorsque vous cliquez sur votre commande et que le vider est de nouveau exécuté, un cycle de vie normal sera Page_Load -> Cliquez sur la commande -> Page_Load (à nouveau) -> Process ItemCommand Event
J’ai eu une expérience avec DataGrid. Une de ses colonnes était le bouton “Sélectionner”. Lorsque je cliquais sur le bouton “Sélectionner” de n’importe quelle ligne, j’avais reçu ce message d’erreur:
“Argument non valide de publication ou de rappel. La validation d’événement est activée dans la configuration ou <% @ Page EnableEventValidation =" true "%> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie que les arguments de publication ou de rappel proviennent du contrôle serveur Si les données sont valides et attendues, utilisez la méthode ClientScriptManager.RegisterForEventValidation pour enregistrer les données de publication ou de rappel en vue de leur validation. ”
J’ai changé plusieurs codes et finalement j’ai réussi. Mon parcours d’expérience:
1) J’ai changé l’atsortingbut de page en EnableEventValidation="false"
. Mais ça n’a pas marché. (non seulement est-ce 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 implémenté ClientScript.RegisterForEventValidation
dans la méthode Render. 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é mon type de bouton dans la colonne de grid de PushButton
à LinkButton
. Ça a marché! (“ButtonType =” LinkButton “). Je pense que si vous pouvez changer votre bouton pour d’autres contrôles comme” 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.
Il y a deux problèmes principaux liés à l’ajout d’éléments à un côté client asp: listbox.
Le premier est qu’il 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 des événements, les éléments de la liste seront recréés à partir de la vue lorsque votre page sera publiée. Par conséquent, toutes les modifications apscopes au client seront perdues. La raison en est qu’un asp.net ne s’attend pas à ce que le contenu d’une listbox soit modifié sur le client, il s’attend seulement à ce qu’une sélection soit faite, de sorte qu’il ignore toutes les modifications que vous avez pu apporter.
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 ce côté client, consiste à utiliser un ancien élément au lieu d’un
et de conserver votre liste d’éléments dans un champ masqué. Lorsque la page est rendue sur le client, vous pouvez la remplir à partir d’un fractionnement du contenu de votre champ de texte.
Ensuite, lorsque vous êtes prêt à le publier, vous remplissez à nouveau le contenu du champ masqué à partir de votre modifiée. Ensuite, bien sûr, vous devez le diviser à nouveau sur le serveur et faire quelque chose avec vos éléments, car 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 faire des modifications côté client d’un listBox, cela fonctionne. Je vous recommande toutefois de regarder dans un updatePanel avant d’aller sur cette route.
J’ai eu le même problème avec un répéteur car j’avais une page Web avec un contrôle Repeater sur un site Web sur lequel EnableEventValidation était activé. Ce n’était pas bien. J’obtenais des exceptions non valides liées à la publication.
Ce qui a fonctionné pour moi était de définir EnableViewState = “false” pour le répéteur. Les avantages sont qu’il est plus simple à utiliser, aussi simple que de désactiver la validation des événements pour le site Web ou la page Web, mais la scope est bien moindre que de désactiver la validation des événements pour l’un ou l’autre.
Rien de ce qui précède n’a fonctionné pour moi. Après plus de fouilles, je me suis rendu compte que j’avais négligé 2 formulaires appliqués sur la page à l’origine du problème.
Sachez qu’ASP.NET a récemment pris en compte les iframes dans une balise de formulaire qui contient une balise de formulaire dans le document iframe lui-même, un cadre nested. 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 en utilisant JavaScript sur le client. Cela se produit lorsque vous ajoutez de nouveaux éléments au ListBox à partir du client qui n’était pas présent lors du rendu de la page.
Le correctif que j’ai trouvé consiste à informer le système de validation d’événements de tous les éléments valides possibles pouvant être ajoutés à partir du client. Vous faites cela en substituant Page.Render et en appelant Page.ClientScript.RegisterForEventValidation pour chaque valeur que votre JavaScript peut append à la zone de liste:
protected override void Render(HtmlTextWriter writer) { foreach (ssortingng val in allPossibleListBoxValues) { Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val); } base.Render(writer); }
Cela peut être 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 – un contenant toutes les valeurs possibles et un autre initialement vide, mais rempli d’un sous-ensemble des valeurs du premier en JavaScript lorsque l’utilisateur clique sur un bouton. Dans ce cas, il vous suffit de parcourir les éléments du premier ListBox et d’enregistrer chacun avec la seconde 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); }
Une autre façon non mentionnée ici est de sous-classer ListBox
C’est à dire.
public class ListBoxNoEventValidation : ListBox { }
ClientEventValidation supprime l’atsortingbut System.Web.UI.SupportsEventValidation si vous le sous-classe, sauf si vous le rajoutez 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é pour le “désactiver” sur une base de contrôle par contrôle (c’est-à-dire pas au niveau de la page).
3: J’ai changé mon type de bouton dans la colonne de grid de “PushButton” à “LinkButton”. Ça a marché! (“ButtonType =” LinkButton “) Je pense que si vous pouvez changer votre bouton pour d’autres contrôles comme” LinkButton “dans d’autres cas, cela fonctionnerait correctement.
J’aimerais pouvoir vous voter, Amir (hélas, mon représentant est trop faible). Je ne faisais que rencontrer ce problème et changer cela fonctionnait comme un champion sur ma grid. Juste un peu de côté, je pense que le code valide est: ButtonType = “Link”
Je pense que cela est dû au fait que lorsque vous cliquez sur “modifier”, vos modifications sont modifiées et “annulées”. Et ces contrôles changeants rendent mal à l’aise .net.
(1) EnableEventValidation = “false” ………………. Cela ne fonctionne pas pour moi.
(2) ClientScript.RegisterForEventValidation …. Cela ne fonctionne pas pour moi.
Solution 1:
Remplacez Button / ImageButton par LinkButton dans GridView. Ça marche. (Mais j’aime ImageButton)
Recherche: Button / ImageButton et LinkButton utilisent différentes méthodes pour publier
Article original:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
Solution 2:
Dans OnInit (), entrez le code 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.ToSsortingng(); } }
Article original:
Si vous remplissez le script DropdownList via le 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 événement “OnChange” au DDL pour collecter la valeur dans une entrée masquée ou dans une zone de texte avec Style = “display: none;”
vous essayez quelque chose comme ça dans votre page .aspx
append
EnableEventValidation = “false”
vous êtes libre de poser n’importe quelle question!
J’ai implémenté une vue de grid nestede et j’ai rencontré le même problème. J’ai utilisé LinkButton au lieu du bouton image comme ceci:
avant d’avoir une colonne comme celle-ci:
J’ai remplacé comme ça.
Si vous changez UseSubmitBehavior="True"
pour UseSubmitBehavior="False"
votre problème sera résolu
J’ai eu le même problème, ce que j’ai fait:
Je viens d’append une condition if(!IsPostBack)
et ça marche bien 🙂
J’ai eu un problème similaire, mais je n’utilisais pas ASP.Net 1.1 ni la mise à jour d’un contrôle via JavaScript. Mon problème ne s’est produit que sur Firefox et non sur IE (!).
J’ai ajouté des options à un object DropDownList sur l’événement PreRender comme ceci:
DropDownList DD = (DropDownList)F.FindControl("DDlista"); HiddenField HF = (HiddenField)F.FindControl("HFlista"); ssortingng[] opcoes = HF.value.Split('\n'); foreach (ssortingng 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 avait des nouvelles lignes) sur les options du “select” 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"); ssortingng dados = HF.Value.Replace("\r", ""); ssortingng[] opcoes = dados.Split('\n'); foreach (ssortingng opcao in opcoes) DD.Items.Add(opcao);
J’espère que cela aidera quelqu’un.
Dans ce cas, ajoutez un identifiant au bouton dans RowDataBound de la grid. Cela résoudra votre problème.
Ajax UpdatePanel le fait, et je pense que c’est le moyen le plus simple, en ignorant la surcharge de publication Ajax .
Je sais que c’est un super post ancien. En supposant que vous appelez dans votre application, voici une idée qui a fonctionné pour moi:
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é ce même problème lorsque nous convertissions nos pages ASPX habituelles en pages de contenu.
La page avec ce problème comportait une dans l’une des sections de contenu, ce qui a entraîné le rendu de deux balises de fin de formulaire lors de l’exécution. La suppression de la balise de fin de formulaire supplémentaire de la page a résolu ce problème.
Cette erreur s’affichera sans publication
Ajouter un code:
If(!IsPostBack){ //do something }
Il y a quatre minutes, j’ai reçu la même erreur. Ensuite, j’ai fait des recherches pendant une demi-heure comme vous. Dans tous les forums, ils disent généralement “append la page enableEvent .. = false ou true”. Toute solution proposée n’a pas résolu mes problèmes tant que je ne l’ai pas trouvée. 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 aussi inacceptable (car cela donnait la même erreur).
Enfin, j’ai remplacé par LinkButton
. ça semble marcher!
Une solution simple à ce problème consiste à utiliser la vérification IsPostBack sur votre chargement de page. Cela résoudra ce problème.
J’utilisais datalist et j’obtenais la même erreur pour mon bouton poussoir. J’utilise simplement IsPostBack pour vérifier et remplir mes commandes et le problème est résolu! Génial!!!
Ce qui a fonctionné pour moi, c’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. Ssortingng 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, ""); }
La meilleure option à faire est d’utiliser un champ masqué et de ne pas désactiver la validation des événements. Modifiez également chaque liste, liste déroulante à sélectionner avec l’atsortingbut du serveur runat.
Si vous utilisez le panneau de mise à jour Ajax. Ajouter la
et à l’intérieur, déclencher le bouton ou le contrôle provoquant le postBack en utilisant
Si vous connaissez les données susceptibles d’être renseignées, vous pouvez utiliser ClientScriptManager pour résoudre ce problème. J’ai eu ce problème en remplissant dynamicment une liste déroulante utilisant javascript sur une sélection d’utilisateur précédente.
Voici un exemple de code pour remplacer la méthode de rendu (en VB et C #) et 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: Cela devrait aller dans le code derrière le fichier (.vb ou .cs) ou s’il est utilisé dans le fichier aspx, vous pouvez envelopper dans les balises .
C’était la raison pour laquelle je l’obtenais:
J’ai eu un ASP: ListBox. Au début, il était caché. Du côté du client, je le remplirais via AJAX avec des options. L’utilisateur a choisi une option. Ensuite, en cliquant sur le bouton Soumettre, le serveur obtiendrait tous des détails sur le contrôle ListBox, car il ne s’en souvenait pas.
Donc, ce que j’ai fait est de m’assurer que toutes les options de la liste sont effacées avant de renvoyer le formulaire au serveur. De cette façon, le serveur ne s’est pas plaint puisque la liste est restée vide et que le client est revenu 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:
-Fausse route:
Item 1 Item 2 Item 3
-La bonne façon:
Item 1 Item 2 Item 3
Cela ne s’est passé pour moi que dans IE10 +