Ich erhalte die folgende Fehlermeldung, wenn ich eine Seite von der Clientseite zurückschicke. Ich habe JavaScript-Code, der eine asp: ListBox auf der Clientseite ändert.
Wie beheben wir das?
Fehlerdetails unten:
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
Antworten:
Das Problem ist, dass ASP.NET dieses zusätzliche oder entfernte Listenelement nicht kennt. Sie haben eine Reihe von Optionen (unten aufgeführt):
Ich hoffe das hilft.
quelle
Haben Sie Codes in Ihren Page Load-Ereignissen? Wenn ja, hilft es vielleicht, wenn Sie Folgendes hinzufügen.
Dieser Fehler wird ausgelöst, wenn Sie auf Ihren Befehl klicken und der Page_load erneut ausgeführt wird. In einem normalen Lebenszyklus wird Page_Load -> Klicken Sie auf Command -> Page_Load (erneut) -> Process ItemCommand Event
quelle
Ich hatte eine Erfahrung mit DataGrid. Eine der Spalten war die Schaltfläche "Auswählen". Als ich in einer Zeile auf die Schaltfläche "Auswählen" geklickt habe, wurde folgende Fehlermeldung angezeigt:
Ich habe mehrere Codes geändert und es ist mir schließlich gelungen. Meine Erfahrungsroute:
1) Ich habe das Seitenattribut in geändert
EnableEventValidation="false"
. Aber es hat nicht funktioniert. (Dies ist nicht nur aus Sicherheitsgründen gefährlich, mein Event-Handler wurde auch nicht aufgerufen:void Grid_SelectedIndexChanged(object sender, EventArgs e)
2) Ich habe
ClientScript.RegisterForEventValidation
in der Render-Methode implementiert . Aber es hat nicht funktioniert.3) Ich habe meinen Schaltflächentyp in der Rasterspalte von
PushButton
auf geändertLinkButton
. Es funktionierte! ("ButtonType =" LinkButton "). Ich denke, wenn Sie Ihre Schaltfläche in anderen Fällen in andere Steuerelemente wie" LinkButton "ändern können, würde dies ordnungsgemäß funktionieren.quelle
Button
nicht funktioniert, wennlinkButton
mit demselben Programm gearbeitet wird. Wenn ja, sollten wir immer verwenden müssenlinkButton
? Wie könnten wir flexibler machen?Sie werden wirklich 2 oder 3 machen wollen, deaktivieren Sie die Ereignisüberprüfung nicht.
Es gibt zwei Hauptprobleme beim Hinzufügen von Elementen zu einem Asp: Listbox-Client-Seite.
Das erste ist, dass es die Ereignisvalidierung stört. Was auf den Server zurückgekommen ist, ist nicht das, was er gesendet hat.
Das zweite ist, dass selbst wenn Sie die Ereignisüberprüfung deaktivieren, die Elemente in der Listbox beim Anzeigen Ihrer Seite aus dem Ansichtsstatus neu erstellt werden, sodass alle Änderungen, die Sie am Client vorgenommen haben, verloren gehen. Der Grund dafür ist, dass ein asp.net nicht erwartet, dass der Inhalt einer Listbox auf dem Client geändert wird, sondern nur, dass eine Auswahl getroffen wird, sodass alle von Ihnen vorgenommenen Änderungen verworfen werden.
Die beste Option ist höchstwahrscheinlich die Verwendung eines Update-Panels, wie empfohlen. Eine andere Option, wenn Sie diese Client-Seite wirklich ausführen müssen, besteht darin, eine einfache alte
<select>
anstelle einer zu verwenden<asp:ListBox>
und Ihre Liste der Elemente in einem ausgeblendeten Feld zu halten. Wenn die Seite auf dem Client gerendert wird, können Sie sie aus einer Aufteilung Ihres Textfeldinhalts auffüllen.Wenn Sie bereit sind, es zu veröffentlichen, füllen Sie den Inhalt des ausgeblendeten Felds erneut aus Ihrem geänderten Feld
<select>
. Dann müssen Sie das natürlich wieder auf dem Server aufteilen und etwas mit Ihren Elementen tun, da Ihre Auswahl jetzt leer ist, da sie wieder auf dem Server ist.Alles in allem ist es eine ziemlich umständliche Lösung, die ich nicht wirklich empfehlen würde, aber wenn Sie wirklich clientseitige Änderungen an einer listBox vornehmen müssen, funktioniert sie. Ich würde Ihnen jedoch wirklich empfehlen, sich ein UpdatePanel anzuschauen, bevor Sie diesen Weg gehen.
quelle
<select>
, was das Problem gelöst hat. Können Sie mir bitte sagen, warum Updatepanel im Vergleich zum clientseitigen Laden von Ajax-Daten viel Zeit zum Laden von Daten benötigt?Ich hatte das gleiche Problem mit einem Repeater, weil ich eine Webseite mit einem Repeater-Steuerelement auf einer Website hatte, auf der EnableEventValidation aktiviert war. Es war nicht gut Ich habe ungültige Ausnahmen im Zusammenhang mit Postbacks erhalten.
Für mich hat es funktioniert, EnableViewState = "false" für den Repeater zu setzen. Die Vorteile sind, dass die Verwendung einfacher ist, so einfach wie das Ausschalten der Ereignisüberprüfung für die Website oder die Webseite, aber der Umfang ist viel geringer als das Ausschalten der Ereignisüberprüfung für beide.
quelle
Keines der oben genannten hat bei mir funktioniert. Nach mehrem Graben stellte ich fest, dass ich zwei auf der Seite angewendete Formulare übersehen hatte, die das Problem verursachten.
Beachten Sie, dass ASP.NET kürzlich damit begonnen hat, Iframes in einem Formular-Tag, das ein Formular-Tag im Iframe-Dokument selbst enthält, als verschachtelten Frame zu betrachten. Ich musste den Iframe aus dem Formular-Tag verschieben, um diesen Fehler zu vermeiden.
quelle
Ich hatte das gleiche Problem beim Ändern einer ListBox mit JavaScript auf dem Client. Dies tritt auf, wenn Sie der ListBox vom Client aus neue Elemente hinzufügen, die beim Rendern der Seite nicht vorhanden waren.
Die Korrektur, die ich gefunden habe, besteht darin, das Ereignisüberprüfungssystem über alle möglichen gültigen Elemente zu informieren, die vom Client hinzugefügt werden können. Sie tun dies, indem Sie Page.Render überschreiben und Page.ClientScript.RegisterForEventValidation für jeden Wert aufrufen, den Ihr JavaScript dem Listenfeld hinzufügen könnte:
Dies kann eine Art Schmerz sein, wenn Sie eine große Anzahl potenziell gültiger Werte für das Listenfeld haben. In meinem Fall habe ich Elemente zwischen zwei ListBoxen verschoben - eine mit allen möglichen Werten und eine, die anfangs leer ist, aber mit einer Teilmenge der Werte aus der ersten in JavaScript gefüllt wird, wenn der Benutzer auf eine Schaltfläche klickt. In diesem Fall müssen Sie nur die Elemente in der ersten ListBox durchlaufen und jedes mit dem zweiten Listenfeld registrieren:
quelle
Eine andere Möglichkeit, die hier nicht erwähnt wird, ist die Unterklasse ListBox
Dh.
ClientEventValidation gibt das Attribut System.Web.UI.SupportsEventValidation aus, wenn Sie es in Unterklassen unterteilen. Wenn Sie es nicht explizit wieder hinzufügen, wird die Validierungsroutine niemals aufgerufen. Das funktioniert mit jedem Steuerelement und ist die einzige Möglichkeit, es auf Steuerelementbasis zu "deaktivieren" (dh nicht auf Seitenebene).
quelle
Sie versuchen so etwas auf Ihrer ASPX-Seite
hinzufügen
Sie können gerne Fragen stellen!
quelle
Wenn Sie die Dropdown-Liste über ein clientseitiges Skript ausfüllen, löschen Sie die Liste, bevor Sie das Formular an den Server zurücksenden. dann beschwert sich ASP.NET nicht und die Sicherheit ist weiterhin aktiviert.
Um die aus der DDL ausgewählten Daten abzurufen, können Sie der DDL ein "OnChange" -Ereignis hinzufügen, um den Wert in einer versteckten Eingabe oder in einem Textfeld mit Style = "display: none;"
quelle
Ich wünschte, ich könnte dich abstimmen, Amir (leider ist mein Repräsentant zu niedrig). Ich hatte nur dieses Problem und das Ändern funktionierte wie ein Champion in meiner Startaufstellung. Nur ein wenig beiseite, ich denke der gültige Code ist: ButtonType = "Link"
Ich vermute, dies liegt daran, dass sich Ihre Bearbeitung beim Klicken auf "Bearbeiten" in "Aktualisieren" und "Abbrechen" ändert und beim Senden wieder in "Bearbeiten" geändert wird. Und diese Schaltsteuerungen machen .net unruhig.
quelle
(1) EnableEventValidation = "false" ................... Es funktioniert nicht bei mir.
(2) ClientScript.RegisterForEventValidation .... Es funktioniert nicht für mich.
Lösung 1:
Ändern Sie Button / ImageButton in GridView in LinkButton. Es klappt. (Aber ich mag ImageButton)
Forschung: Button / ImageButton und LinkButton verwenden unterschiedliche Methoden zum Postback
Originaler Artikel:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
Lösung 2:
Geben Sie in OnInit () den folgenden Code ein, um eine eindeutige ID für Button / ImageButton festzulegen:
Originaler Artikel:
http://www.c-sharpcorner.com/Forums/Thread/35301/
quelle
Ich habe eine verschachtelte Rasteransicht implementiert und hatte das gleiche Problem. Ich habe LinkButton anstelle der folgenden Bildschaltfläche verwendet:
bevor ich eine Kolumne wie diese hatte:
Ich habe so ersetzt.
quelle
Ich hatte ein ähnliches Problem, aber ich habe weder ASP.Net 1.1 verwendet noch ein Steuerelement über Javascript aktualisiert. Mein Problem trat nur in Firefox und nicht in IE (!) Auf.
Ich habe einer DropDownList im PreRender-Ereignis folgende Optionen hinzugefügt:
Bei meinem "HF" (verstecktes Feld) waren die Optionen durch die neue Zeile wie folgt getrennt:
Das Problem war, dass die HTML-Seite in den Optionen der "Auswahl", die das DropDown darstellte, beschädigt war (ich meine, es gab Zeilenumbrüche).
Also habe ich mein Problem gelöst und eine Zeile hinzugefügt:
Hoffe das hilft jemandem.
quelle
Wenn Sie
UseSubmitBehavior="True"
zuUseSubmitBehavior="False"
Ihrem Problem wechseln , wird es gelöstquelle
Ich hatte das gleiche Problem, was ich getan habe:
Habe gerade eine Bedingung hinzugefügt
if(!IsPostBack)
und es funktioniert gut :)quelle
Dieser Fehler wird ohne Postback angezeigt
Code hinzufügen:
quelle
In diesem Fall fügen Sie der Schaltfläche in RowDataBound des Rasters eine ID hinzu. Es wird Ihr Problem lösen.
quelle
Eine einfache Lösung für dieses Problem besteht darin, die IsPostBack- Prüfung für das Laden Ihrer Seite zu verwenden. Das wird dieses Problem lösen.
quelle
Ajax UpdatePanel schafft es, und ich denke, es ist der einfachste Weg, den Ajax-Postback- Overhead zu ignorieren .
quelle
Ich weiß, dass dies ein super alter Beitrag ist. Angenommen, Sie rufen Ihre Bewerbung an, dann ist hier eine Idee, die für mich funktioniert hat:
Wenn Sie keine vollständige Kontrolle benötigen, können Sie ein Update-Panel verwenden, das dies für Sie erledigt.
quelle
Wir sind auf dasselbe Problem gestoßen, als wir unsere regulären ASPX-Seiten in Inhaltsseiten konvertierten.
Die Seite mit diesem Problem hatte ein
</form>
Tag in einem der Inhaltsabschnitte. Daher wurden zur Laufzeit zwei Formularende-Tags gerendert, die dieses Problem verursachten. Durch Entfernen des zusätzlichen Formularende-Tags von der Seite wurde dieses Problem behoben.quelle
<form>
Felder in meinem Code hatte.Wenn Sie gridview verwenden und gridview bei pageload inside! Ispostback nicht binden, tritt dieser Fehler auf, wenn Sie in gridview auf Zeile bearbeiten und löschen klicken.
quelle
Vor vier Minuten habe ich den gleichen Fehler erhalten. Dann habe ich während einer halben Stunde wie Sie recherchiert. In allen Foren heißt es im Allgemeinen "Seite hinzufügen enableEvent .. = false oder true". Jede vorgeschlagene Lösung löste meine Probleme nicht, bis ich sie fand. Das Problem ist leider eine ASP.NET-Schaltfläche. Ich habe es vor zwei Sekunden entfernt. Ich habe versucht, durch "imagebutton" zu ersetzen, aber es war auch nicht akzeptabel (weil es den gleichen Fehler gab).
Endlich habe ich durch ersetzt
LinkButton
. es scheint zu funktionieren!quelle
Ich habe eine Datenliste verwendet und habe den gleichen Fehler für meinen Druckknopf erhalten. Ich benutze nur IsPostBack, um meine Steuerelemente zu überprüfen und zu füllen, und das Problem ist gelöst! Toll!!!
quelle
Was für mich funktioniert hat, ist das Verschieben des folgenden Codes von page_load nach page_prerender:
quelle
Die beste Option ist, ein verstecktes Feld zu verwenden und die Ereignisüberprüfung nicht zu deaktivieren. Ändern Sie außerdem jede Listbox und Dropdown-Liste, um sie mit dem Attribut runat server auszuwählen
quelle
Wenn Sie das Ajax-Update-Panel verwenden. Fügen Sie ein
<Triggers>
Tag hinzu und lösen Sie darin den Button oder das Steuerelement aus, das das PostBack verwendet<asp:PostBackTrigger .../>
quelle
Wenn Sie die Daten, die ausgefüllt werden könnten, im Voraus kennen, können Sie dieses Problem mit dem ClientScriptManager beheben. Ich hatte dieses Problem beim dynamischen Auffüllen eines Dropdown-Felds mit Javascript bei einer vorherigen Benutzerauswahl.
Hier ist ein Beispielcode zum Überschreiben der Rendermethode (in VB und C #) und zum Deklarieren eines potenziellen Werts für die Dropdown-Liste ddCar.
In VB:
oder eine leichte Variation in C # könnte sein:
Für Neulinge: Dies sollte im Code hinter der Datei (.vb oder .cs) enthalten sein, oder wenn es in der Aspx-Datei verwendet wird, können Sie
<script>
Tags einschließen .quelle
Dies war der Grund, warum ich es bekam:
Ich hatte eine ASP: ListBox. Anfangs war es versteckt. Auf Client-Seite würde ich es über AJAX mit Optionen füllen. Der Benutzer hat eine Option ausgewählt. Wenn Sie dann auf die Schaltfläche "Senden" klicken, wird der Server über die ListBox sehr lustig, da er sich nicht daran erinnert, dass er über Optionen verfügt.
Ich habe also sichergestellt, dass alle Listenoptionen gelöscht sind, bevor das Formular an den Server zurückgesendet wird. Auf diese Weise beschwerte sich der Server nicht, da die Liste leer an den Client ging und leer zurückkam.
Sortiert !!!
quelle