Ungültiges Postback- oder Callback-Argument. Die Ereignisüberprüfung wird mit '<pages enableEventValidation = “true” />' aktiviert.


238

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

Führen Sie im Ereignis page_load keine Datenbindung durch.
Paul Zahra

Antworten:


171

Das Problem ist, dass ASP.NET dieses zusätzliche oder entfernte Listenelement nicht kennt. Sie haben eine Reihe von Optionen (unten aufgeführt):

  • Deaktivieren Sie die Ereignisvalidierung (schlechte Idee, da Sie ein wenig Sicherheit verlieren, die mit sehr geringen Kosten verbunden ist).
  • Verwenden Sie ASP.NET Ajax UpdatePanel. (Fügen Sie die Listbox in das Updatepanel ein und lösen Sie ein Update aus, wenn Sie eine Listbox hinzufügen oder entfernen. Auf diese Weise erhalten der Ansichtsstatus und verwandte Felder Updates und die Ereignisvalidierung wird bestanden.)
  • Vergessen Sie die Clientseite und verwenden Sie das klassische Postback und fügen Sie die Listenelemente serverseitig hinzu oder entfernen Sie sie.

Ich hoffe das hilft.


Eine weitere Option: Implementieren Sie IPostBackEventHandler und rufen Sie js __doPostBack ('<% = UniqueId.ToString ()%>', arg) auf
gdbdable

Basierend auf den obigen Vorschlägen habe ich meine Dropdowns in ein reguläres ASP.NET asp: UpdatePanel eingefügt, die Dropdowns im Code dahinter geladen und dann upNewRecord.Update ();
Ricardo Appleton

183

Haben Sie Codes in Ihren Page Load-Ereignissen? Wenn ja, hilft es vielleicht, wenn Sie Folgendes hinzufügen.

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

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


7
aha! Vielen Dank, das war der Trick in meinem Fall! Ich habe eine Dropdown-Liste in der Seitenlade neu geladen, und so verlor das Framework die Kontrolle über die Elemente (die neuen) in der ddl und die, auf die ich geklickt habe (die nicht mehr existierten)
Michel

Ich hatte den gleichen Fehler wie das OP ... Ich habe einen Assistenten in meinem Formular verwendet und den 0-Schritt beim Laden meiner Seite aufgerufen. entfernte das und Problem verschwand. Danke ...
tking

Vielen Dank für diese Antwort. Hatte das gleiche Problem und es stellte sich heraus, dass ich vergessen hatte, Postbacks beim Laden von Daten in mein Raster zu ignorieren. Sparen Sie mir viel Zeit
Quagmire

10
Duh! Die Rückkehr zu Webformularen von MVC ist ein Schmerz. Dies ist die richtige Antwort
Vishnoo Rath

2
Ich habe dies getan, aber es hat bei mir nicht funktioniert, da es Code gibt, den ich im page_load-Ereignis ausführen muss, wenn es kein Postback ist, und daher immer noch der gleiche Fehler aufgetreten ist. Das Deaktivieren des Ansichtsstatus für meinen Repeater hat das Problem stattdessen behoben.
Bryan

40

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:

"Ungültiges Postback- oder Callback-Argument. Die Ereignisüberprüfung wird mithilfe der Konfiguration oder <% @ Page EnableEventValidation =" true "%> auf einer Seite aktiviert. Aus Sicherheitsgründen überprüft diese Funktion, ob Argumente für Postback- oder Callback-Ereignisse vom Serversteuerelement stammen Sie wurden ursprünglich gerendert. Wenn die Daten gültig und erwartet sind, verwenden Sie die ClientScriptManager.RegisterForEventValidation-Methode, um die Postback- oder Callback-Daten zur Validierung zu registrieren. "

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.RegisterForEventValidationin der Render-Methode implementiert . Aber es hat nicht funktioniert.

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) Ich habe meinen Schaltflächentyp in der Rasterspalte von PushButtonauf geändert LinkButton. 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.


1
Meine Lösung bestand darin, auf Verschachtelungsschaltflächen im Datagrid zu verzichten. MS versagt mir noch einmal.
Jacobs Data Solutions

Ihre Lösung funktioniert auch für mich. Danke dir. Aber ich möchte wissen, warum Buttonnicht funktioniert, wenn linkButtonmit demselben Programm gearbeitet wird. Wenn ja, sollten wir immer verwenden müssen linkButton? Wie könnten wir flexibler machen?
Frank Myat Do

8
Versuchen Sie, zu Ihrer Schaltfläche hinzuzufügen UseSubmitBehavior = "False" stackoverflow.com/questions/2968525/…
JJschk

Awesomeeeeeee :) .. Sie können dies nur durch Erfahrung lernen .. Sie haben bewiesen, dass echte Szenerio tat Shows Erfahrung ist der beste Lehrer .. Tolle Ans und Erklärung!
saun4frsh

In der Überschreibung für Rendern MÜSSEN SIE base.Render (Writer) setzen; am Ende ... sonst geht es nicht!
Paul Zahra

28

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.


3
c, Sie müssen die ausgewählten Elemente nicht in einem ausgeblendeten Feld aufbewahren. Wenn Sie das Auswahlfeld runat = "server" aktivieren, können Sie den zurückgesendeten Wert aus Request.Form [ selectid .UnqiueID] lesen. Und wenn mehrere ausgewählt sind, veröffentlicht der Browser die Werte als CSV. Beachten Sie, dass die Elemente und ausgewählten Indexeigenschaften des Steuerelements auf dem Server falsch sind, da Sie die itrmlist auf dem Client geändert haben, von der der Server nichts weiß.
Michael

Michael, das hat funktioniert. Solange Sie "multiple = true" hinzufügen, erhalten Sie nur 1 Wert. Vielen Dank
Sameer Alibhai

1
Hatte das gleiche Problem für eine Dropdown-Liste mit Zeilenumbrüchen. Der Wechsel zu einer Auswahl hat perfekt funktioniert. Vielen Dank!
Thchaver

Ich habe einfach alt verwendet <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?
Pranesh Janarthanan

17

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.


3
Ich hatte genau dieses Problem mit einer alten Websteuerung. Unsere Webplattform / CMS (Sitecore) hat ein großes Update erhalten, das die Ereignisvalidierung aktiviert hat (es war zuvor deaktiviert! Autsch!). Das Repeater-Steuerelement zeigte Bilder in einer Webgalerie an (mit Schaltflächen zum Neuanordnen), und beim Postback dieser Schaltflächen trat die Ausnahme auf. Ich habe den Ansichtsstatus auf den Repeatern mit EnableViewState = "false" deaktiviert, wie Sie vorgeschlagen haben, und hey presto es hat funktioniert. Wie andere festgestellt haben, hat das Überschreiben von Render () und die Verwendung von ClientScriptManager.RegisterForEventValidation () bei mir nicht funktioniert. DANKE!
Xan

Wie @xan benutze ich auch Sitecore und genau das habe ich gebraucht.
Wilsjd

Das hat auch bei mir funktioniert. Das AJAX-Update-Panel hätte auch funktioniert, aber es war aufgebläht, was ich in diesem Fall nicht brauchte. Vielen Dank, Umar Farooq Khawaja.
Bryan

17

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.

<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>

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.


12

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:

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

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:

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

9

Eine andere Möglichkeit, die hier nicht erwähnt wird, ist die Unterklasse ListBox

Dh.

public class ListBoxNoEventValidation : ListBox 
{
}

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).


2
Schön hier beschrieben .
Pavel Hodek

1
Ich denke, der beste Weg, dies zu erreichen, ist dies. Wir sollten es auf der Steuerungsebene und nicht auf der Seitenebene beheben und die Sicherheit aller beteiligten Steuerelemente +1 riskieren. Vielen Dank für @PavelHodek für diesen Link.
James Poulose

Leider scheint es, dass in diesem Fall alle auf dem Client hinzugefügten Listenelemente nicht erkannt werden, wenn sie beim Zurücksenden der Seite als ausgewähltes Element ausgewählt wurden.
Jonathan Wood

9

Sie versuchen so etwas auf Ihrer ASPX-Seite

hinzufügen

EnableEventValidation = "false"

Sie können gerne Fragen stellen!


Ich würde argumentieren, wenn die Deaktivierung des integrierten Validierungsangebots durch das Framework, um zu verhindern, dass Fehler angezeigt werden, in diesem Fall die am besten geeignete Lösung wäre.
Jviaches

8

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;"


+1 Einfach zu implementieren. Könnte nicht die sauberste sein, aber einfach genug.
Nutsch

7

3: Ich habe meinen Schaltflächentyp in der Rasterspalte von "PushButton" in "LinkButton" geändert. 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.

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.


Der Kern dieses Problems ist das asp.net-Ereignisvalidierungsmodell und ob die "Seite" vom Client zu dem Zeitpunkt geändert wird, an dem Sie einen Beitrag zurückschicken. Was meinst du mit '..... und diese Schaltsteuerung macht .net unruhig'?
Julius A

7

(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:

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();           
  }
}

Originaler Artikel:

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


6

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:

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

Ich habe so ersetzt.

<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> 

5

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:

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);

Bei meinem "HF" (verstecktes Feld) waren die Optionen durch die neue Zeile wie folgt getrennt:

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

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:

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);

Hoffe das hilft jemandem.


4

Wenn Sie UseSubmitBehavior="True" zu UseSubmitBehavior="False"Ihrem Problem wechseln , wird es gelöst

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

Das hat bei mir nicht funktioniert. Ich verwende jedoch einen Bildknopf und eine Tabelle in einem Repeater. Es ist also nicht genau die gleiche Situation. Das Deaktivieren des Ansichtsstatus des Repeaters hat bei mir funktioniert.
Bryan

3

Ich hatte das gleiche Problem, was ich getan habe:

Habe gerade eine Bedingung hinzugefügt if(!IsPostBack)und es funktioniert gut :)


3

Dieser Fehler wird ohne Postback angezeigt

Code hinzufügen:

If(!IsPostBack){

 //do something

}

2

In diesem Fall fügen Sie der Schaltfläche in RowDataBound des Rasters eine ID hinzu. Es wird Ihr Problem lösen.


2

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.


2

Ajax UpdatePanel schafft es, und ich denke, es ist der einfachste Weg, den Ajax-Postback- Overhead zu ignorieren .


2

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:

  1. Implementieren Sie den ICallbackEventHandler auf Ihrer Seite
  2. Rufen Sie ClientScriptManager.GetCallbackEventReference auf, um Ihren serverseitigen Code aufzurufen
  3. Wie in der Fehlermeldung angegeben, können Sie dann ClientScriptManager.RegisterForEventValidation aufrufen

Wenn Sie keine vollständige Kontrolle benötigen, können Sie ein Update-Panel verwenden, das dies für Sie erledigt.


2

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.


Danke, es stellte sich heraus, dass ich auch zusätzliche <form>Felder in meinem Code hatte.
Eric Kigathi

2

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.

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        bindGridview();
        }

1

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!


1

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!!!


1

Was für mich funktioniert hat, ist das Verschieben des folgenden Codes von page_load nach 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>");
}

1

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


Der Wechsel von der Asp-Steuerung zur regulären <select id = "director" runat = "server"> hat hervorragend funktioniert. Ich konnte auf seinen Wert im Code dahinter zugreifen, indem ich Folgendes verwendete: Beispiel: string DirectorId = Request.Form [Director.ID]
Baxter

1

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 .../>


1

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:

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

oder eine leichte Variation in C # könnte sein:

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

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 .


1

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 !!!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.