Argument de postback ou de callback invalide. La validation de l'événement est activée en utilisant ' '
j'obtiens l'erreur suivante quand j'ai publier une page côté client. J'ai le code JavaScript qui modifie une liste asp:ListBox du côté client.
comment arranger ça?
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
30 réponses
le problème est que ASP.NET ne prend pas connaissance de ce listitem 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, parce que vous perdez un peu de sécurité qui vient avec très peu de coût).
- Use ASP.NET Ajax UpdatePanel. (Mettez la listbox dans le menu Updatepanel et déclenchez une mise à jour, si vous ajoutez ou supprimez listbox. De cette façon, viewstate et les champs connexes reçoivent des mises à jour et eventvalidation va passer.)
- oubliez le côté client et utilisez le postback classique et ajoutez ou supprimez le côté serveur de listitems.
j'espère que cette aide.
avez-vous des codes dans vos événements Page_Load? si oui, alors peut-être par adjonction de l'aide.
if (!Page.IsPostBack)
{ //do something }
cette erreur est lancée lorsque vous cliquez sur votre commande et le Page_load est lancé à nouveau, dans 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" Select". Lorsque je cliquais sur le bouton" Sélectionner "d'une rangée, j'avais reçu ce message d'erreur:
" argument postback ou callback invalide. La validation de l'événement est activée en utilisant la configuration ou < % @ Page Enableventvalidation= "true" % > dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie que les arguments à postback ou rappel des événements proviennent du serveur le contrôle qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez ClientScriptManager.RegisterForEventValidation méthode pour enregistrer la publication ou de rappel de données pour la validation."
j'ai changé plusieurs codes, et finalement j'ai réussi. Mon itinéraire d'expérience:
1) j'ai changé l'attribut de page en EnableEventValidation="false"
. mais ça n'a pas marché. dangereux
pour des raisons de sécurité, mon gestionnaire d'événements n'a pas été appelé: void Grid_SelectedIndexChanged(object sender, EventArgs e)
2) j'ai implémenté 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é mon type de bouton dans la colonne de grille de PushButton
à LinkButton
. ça a marché! ("ButtonType= "LinkButton"). Je pense que si tu peux changer ton bouton en un autre des commandes comme" LinkButton " dans d'autres cas, ça fonctionnerait correctement.
Vous êtes vraiment à faire 2 ou 3, ne désactivez pas l'événement de validation.
Il y a deux problèmes principaux avec l'ajout d'éléments à un asp:listbox côté client.
-
la première est qu'elle interfère avec la validation de l'événement. Ce qui est venu sur le serveur n'est pas ce qu'il a envoyé.
-
la seconde est que même si vous désactivez la validation de l'événement, lorsque votre page est postée retour les éléments de la liste seront reconstruits à partir de viewstate, de sorte que tout changement que vous avez fait sur le client est perdu. La raison en est qu'un asp.net ne s'attend pas à ce que le contenu d'une liste de diffusion soit modifié sur le client, il s'attend seulement à ce qu'une sélection soit faite, de sorte qu'il écarte tout changement que vous pourriez avoir fait.
la meilleure option est la plus susceptible d'utiliser un panneau de mise à jour comme cela a été recommandé. Une autre option, si vous avez vraiment besoin de faire ce client côté, est d'utiliser un bon vieux <select>
au lieu de <asp:ListBox>
, et de garder votre liste d'éléments dans un champ caché. Lorsque la page rend sur le client, vous pouvez la remplir à partir d'une Division de votre contenu de champ de texte.
ensuite, lorsque vous êtes prêt à le poster, vous repeuplez le contenu du champ caché à partir de votre <select>
modifié . Ensuite, bien sûr, vous devez partager cela à nouveau sur le serveur et faire quelque chose avec vos articles, puisque votre select est vide maintenant qu'il 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'une liste de diffusion, cela fonctionne. Je vous recommande vraiment de regarder dans une updatePanel avant d'aller cette route, cependant.
j'ai eu le même problème avec un répéteur parce que j'avais une page Web avec un contrôle de répéteur dans un site web qui avait la validation Enableevable activé. Il n'était pas bon. Je recevais des exceptions non valides liées à postback.
ce qui a fonctionné pour moi était de mettre EnableViewState=" false " pour le répéteur. Les avantages sont qu'il est plus simple à utiliser, aussi simple que la validation d'événement de commutation off pour le site web ou la page web, mais la portée est beaucoup moins que de changer l'événement validation désactivée pour l'un ou l'autre.
rien de ce qui précède n'a fonctionné pour moi. Après avoir creusé plus j'ai réalisé que j'avais oublié 2 formulaires appliqués sur la page 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>
soyez conscient que récemment ASP.NET a commencé à considérer iframes dans une étiquette de forme qui contient une étiquette de forme dans le document iframe lui-même un cadre imbriqué. J'ai dû déplacer l'iframe de la balise form pour éviter cette erreur.
j'ai eu le même problème lors de la modification d'une liste en utilisant JavaScript sur le client. Il se produit lorsque vous ajoutez de nouveaux éléments à la liste de liste du client qui n'étaient pas là lorsque la page a été rendue.
le correctif que j'ai trouvé est d'informer le système de validation des événements de tous les éléments valides possibles qui peuvent être ajoutés à partir du client. Vous faites cela en remplaçant Page.Page de rendu et d'appel.ClientScript.Registrerforeventvalidation pour chaque valeur que votre JavaScript ajouter à la liste:
protected override void Render(HtmlTextWriter writer)
{
foreach (string val in allPossibleListBoxValues)
{
Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
}
base.Render(writer);
}
cela peut être une sorte de douleur si vous avez un grand nombre de valeurs potentiellement valables pour la boîte de liste. Dans mon cas, je déplaçais des éléments entre deux listes - une qui contient toutes les valeurs possibles et une autre qui est initialement vide mais est remplie avec un sous-ensemble des valeurs de la première dans JavaScript lorsque l'utilisateur clique sur un bouton. Dans ce cas, vous avez juste besoin d'itérer à travers les éléments de la première liste et inscrivez-les dans la deuxième case de la 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 voie non mentionnée ici est la sous-classe ListBox
Ie.
public class ListBoxNoEventValidation : ListBox
{
}
ClientEventValidation clés de l'attribut Système.Web.INTERFACE.SupportsEventValidation si vous la sous-classe, à moins que vous ne l'ajoutiez explicitement de nouveau, elle 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 le niveau de la page).
3: j'ai changé mon type de bouton dans la grille colonne de "Bouton" pour "LinkButton". Il a travaillé! ("ButtonType= "LinkButton") je pense que si vous pouvez modifier votre bouton à d'autres contrôles comme "LinkButton" dans d'autres cas, elle fonctionne correctement.
j'aimerais pouvoir voter pour vous, Amir (hélas, ma réputation est trop basse. J'avais juste ce problème et changer ça a fonctionné comme un champion sur mon gridview. Juste un peu à part, je pense que le valable le code est: ButtonType= "Link "
je soupçonne que c'est parce que lorsque vous cliquez sur "Modifier", votre modifier les changements à "mettre à jour" et "annuler" qui puis revenir à "modifier" sur soumettre. Et ces changements de contrôle rendent .net mal à l'aise.
(1) Enableventvalidation= "false"...................Ça ne marche pas pour moi.
(2) ClientScript.Validation de l'enregistrement....Ça ne marche pas pour moi.
Solution 1:
Change Button / ImageButton en LinkButton dans GridView. Elle fonctionne. (Mais j'aime ImageButton)
recherche: Bouton / ImageButton et LinkButton utiliser des méthodes différentes pour postback
article Original:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
Solution 2:
dans OnInit() , entrez le code quelque chose 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 Original:
si vous remplissez la DropdownList par le biais du script côté client, puis effacer la liste avant de soumettre le formulaire de nouveau au serveur; puis ASP.NET ne se plaindra pas et la sécurité sera toujours en marche.
et pour obtenir les données sélectionnées à partir de la DDL, vous pouvez attacher un événement "OnChange" à la DDL pour collecter la valeur dans une entrée cachée ou dans une boîte de texte avec Style= "display: none; "
vous essayez quelque chose comme ça,dans votre .aspx page
ajouter
Enableventvalidation= "false"
vous vous sentez libre de poser n'importe quelle question!
j'ai mis en place une vue de grille emboîtée et j'ai fait face au même problème .J'ai utilisé LinkButton au lieu du bouton image comme ceci:
avant j'avais une colonne comme ceci:
<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 ceci.
<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>
si vous changez UseSubmitBehavior="True"
en 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 eu le même problème, ce que j'ai fait:
vient D'ajouter une condition if(!IsPostBack)
et cela fonctionne très bien:)
j'ai eu un problème similaire, mais je n'ai pas utilisé ASP.Net 1.1 ni la mise à jour d'un contrôle par javascript. Mon problème est arrivé seulement sur Firefox et pas sur IE (!).
j'ai ajouté des options à une DropDownList sur L'événement PreRender comme ceci:
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 le caractère de saut de 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 newlines) sur le options du "select" qui représente le DropDown.
Alors j'ai 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);
Espérons que cela aide quelqu'un.
dans ce cas, ajouter id au bouton dans RowDataBound de la grille. Il permettra de résoudre votre problème.
une solution simple pour ce problème est d'utiliser le IsPostBack vérifier sur votre page de charge. Qui permettra de résoudre ce problème.
Ajax UpdatePanel le fait, et je pense que c'est le "151910920 plus" facile , en ignorant le Ajax publication "151920920-dessus de la tête.
je sais que c'est un super vieux post. En supposant que vous appelez dans votre application, voici une idée qui a fonctionné pour moi:
- implémenter le ICallbackEventHandler sur votre page
- Appelez ClientScriptManager.GetCallbackEventReference pour appeler votre code côté serveur
- comme l'indique le message d'erreur, vous pouvez alors appeler ClientScriptManager.Validation des registres
si vous n'avez pas besoin de contrôle total, vous pouvez utiliser un panneau de mise à jour qui le ferait pour vous.
nous avons rencontré ce même problème lorsque nous avons converti nos pages ASPX régulières en pages de contenu.
la page de ce numéro avait une étiquette </form>
dans l'une des sections de contenu, donc deux étiquettes de fin de formulaire ont été rendues au moment de l'exécution, ce qui a causé ce problème. 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 postback
ajouter le code:
If(!IsPostBack){
//do something
}
il y a quatre minutes, j'ai reçu la même erreur. J'ai fait des recherches pendant une demi-heure comme toi. Dans tous les forums, ils sont généralement dire " ajouter page enablevent..=false ou true". Toute solution proposée n'a pas résolu mes problèmes jusqu'à ce que je le trouve. Le problème est malheureusement ASP.NET bouton. Je l'ai enlevé deux secondes plus tôt. J'ai essayé de remplacer par "imagebutton", mais c'était aussi inacceptable (parce qu'il donnait la même erreur).
enfin j'ai remplacé par LinkButton
. il semble être au travail!
j'utilisais datalist et j'ai eu la même erreur pour mon bouton-poussoir. J'utilise IsPostBack pour vérifier et remplir mes commandes et le problème est résolu! Grand!!!
ce qui a fonctionné pour moi est de déplacer le code suivant de page_load à 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 le champ caché et ne pas désactiver la validation d'événement, aussi changer chaque liste de diffusion, dropdownlist à sélectionner avec l'attribut runat server
si vous utilisez le panneau de mise à jour Ajax. Ajouter <Triggers>
tag et à l'intérieur de celui-ci déclencher le bouton ou la commande provoquant le postBack en utilisant <asp:PostBackTrigger .../>
si vous connaissez d'avance les données qui pourraient être peuplées, vous pouvez utiliser le ClientScriptManager pour résoudre ce problème. J'ai eu ce problème en peuplant dynamiquement une boîte de goutte en utilisant javascript sur une sélection d'utilisateur précédente.
voici un exemple de code pour outrepasser la méthode render (en VB et C#) et déclarer une valeur potentielle pour la DropDownList 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 fichier code-behind (.vb ou .cs) ou si utilisé dans le fichier aspx vous pouvez envelopper dans <script>
tags.
C'est la raison pour laquelle je l'ai reçu:
j'ai eu un ASP:ListBox. Initialement, il a été caché. Côté client, je le remplirais via AJAX avec des options. L'utilisateur a choisi une option. Puis, en cliquant sur le bouton Soumettre, le serveur devient tout drôle à propos de la liste, car il ne se souvient pas qu'il avait des options.
donc ce que j'ai fait est de m'assurer que j'efface toutes les options de liste avant de soumettre le formulaire de nouveau au serveur. De cette façon, le le serveur ne s'est pas plaint puisque la liste est allée au client vide et il est revenu vide.
trié!!!
comme Nick B l'a dit et cela a fonctionné pour moi, vous devez supprimer les ruptures de ligne dans certains cas. Regardez le code:
-de manière Erronée:
<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>
- droit chemin:
<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 s'est produit seulement pour moi dans IE10+