Frage

Ich erhalte die folgende Fehlermeldung, wenn ich wieder eine Seite von der Client-Seite posten. Ich habe JavaScript-Code, der eine asp modifiziert. ListBox auf der Client-Seite

Wie können wir dieses Problem beheben?

Fehlerdetails unter:

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
War es hilfreich?

Lösung

Das Problem ist, dass ASP.NET nicht über diese zusätzliche oder entfernt listitem wissen bekommt. Sie haben eine Reihe von Optionen (siehe unten):

  • Deaktivieren Eventvalidation (schlechte Idee, weil Sie ein wenig an Sicherheit verlieren, die mit sehr geringen Kosten kommen).
  • Verwenden Sie ASP.NET Ajax Update. (Legen Sie die Listbox im Updatepanel und ein Update auslösen, wenn Sie listbox hinzufügen oder entfernen. Auf diese Weise Ansichtszustand und verwandten Bereichen erhalten Updates und Eventvalidation wird vorübergehen.)
  • Forget Client-Seite und verwenden Sie die klassischen Postbacks und hinzufügen oder die Listitem serverseitige entfernen.

Ich hoffe, das hilft.

Andere Tipps

Haben Sie Codes in Ihnen Ereignisse Page_load? wenn ja, dann vielleicht durch die folgende Zugabe helfen.

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

Dieser Fehler wird ausgelöst, wenn Sie auf Ihren Befehl klicken und Page_Load lief wieder wird, in einem normalen Lebenszyklus wird > Klicken Sie auf Befehl - - Page_Load> Page_Load (wieder) -> Prozess ItemCommand Ereignis

Ich hatte eine Erfahrung mit Datagrid. Eines davon ist Spalten „Auswählen“ war. Als ich Sie auf „Auswählen“ jeder Zeile ich diese Fehlermeldung erhalten hat:

  

"Ungültige Postback oder Callback-Argument. Die Ereignisvalidierung aktiviert ist in der Konfiguration mit oder       <% @ Page EnableEventValidation = "true" %> in einer Seite. Aus Sicherheitsgründen überprüft dieses Feature, dass Argumente für Postback oder       Callback-Ereignisse vom Server Kontrolle stammen, die ursprünglich ihnen gemacht. Wenn die Daten gültig und erwartet ist, verwenden Sie die       ClientScriptManager.RegisterForEventValidation Methode, um die Postbacks oder Callback-Daten für die Validierung zu registrieren. "

Ich änderte mehrere Codes, und schließlich gelang es mir. Meine Erfahrung Route:

1) I geänderte Seite Attribut EnableEventValidation="false". Aber es hat nicht funktioniert. (nicht nur ist diese gefährlich    Aus Sicherheitsgründen wurde mein Event-Handler nicht genannt: void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) I umgesetzt ClientScript.RegisterForEventValidation in Render-Methode. 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) änderte ich meinen Knopf in Rasterspalte von PushButton LinkButton. Es hat funktioniert! ( „Button =“ Linkbutton "). Ich denke, wenn Sie Ihre Taste, um andere Steuerelemente wie ändern können‚Linkbutton‘in anderen Fällen wäre es richtig funktionieren.

Sie gehen zu wollen, wirklich 2 oder 3 tun, nicht die Ereignisvalidierung deaktivieren.

Es gibt zwei Hauptprobleme, mit Elementen zu einem asp hinzufügen:. Listbox Client-Seite

  • Die erste ist, dass es mit Ereignisvalidierung stört. Was an den Server zurück kam, ist nicht das, was sie herabgesandt hat.

  • Die zweite ist, dass selbst wenn Sie die Ereignisvalidierung deaktivieren, wenn Ihre Seite wird die Einzelteile in der Listbox geschrieben zurück aus dem Ansichtszustand wieder aufgebaut werden, so dass alle Änderungen, die Sie auf dem Client vorgenommen werden verloren. Der Grund dafür ist, dass ein asp.net nicht der Inhalt eines listbox auf dem Client geändert werden nicht erwartet, erwartet es nur eine Auswahl getroffen werden, so verwirft er alle vorgenommenen Änderungen haben könnten.

Die beste Option ist höchstwahrscheinlich einen Update-Panel zu verwenden, wie empfohlen worden. Eine weitere Option, wenn Sie auch wirklich diesen Client-Seite tun müssen, ist eine einfache alte <select> anstelle eines <asp:ListBox> zu verwenden, und der Liste der Elemente in einem versteckten Bereich zu halten. Wenn die Seite auf dem Client rendert können Sie es von einer Spaltung der Textfeldinhalte füllen.

Dann, wenn Sie bereit sind, es zu schreiben, besiedeln Sie die Inhalte von Ihrem modifizierten <select> verborgenen Feld. Dann, natürlich, müssen Sie das noch einmal auf dem Server aufgeteilt und etwas tun mit Ihren Einzelteilen, da Ihr auserwählten leer ist jetzt, dass es wieder auf dem Server.

Alles in allem ist es eine ziemlich umständliche Lösung, die ich nicht wirklich empfehlen würde, aber wenn Sie wirklich clientseitige Modifikationen eines List-Box zu tun haben, es funktioniert. Ich würde wirklich empfehlen Sie einen Update suchen, die vor diesem Weg gehen, aber.

Ich hatte das gleiche Problem mit einem Repeater, weil ich eine Web-Seite mit einem Repeater-Steuerelement in einer Web-Site hatte die EnableEventValidation hatte eingeschaltet. Es war nicht gut. Ich war ungültig Postbacks bezogene Ausnahmen zu bekommen.

Was für mich gearbeitet wurde EnableViewState = "false" für den Repeater zu setzen. Die Vorteile sind, dass es einfacher ist, so einfach zu bedienen wie die Ereignisvalidierung off für die Web-Site oder Web-Seite wechseln, aber der Umfang ist viel weniger als Schalt entweder für die Ereignisvalidierung aus.

Keine der oben für mich gearbeitet. Nach mehr Graben wurde mir klar, ich 2 bildet sich auf der Seite angewendet übersehen hatte, die das Problem verursacht wurde.

<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 vor kurzem ASP.NET begonnen hat iframes in einem Formular-Tag unter Berücksichtigung, die einen Form-Tag in dem iframe Dokument enthält selbst ein verschachtelter Rahmen. Ich musste die iframe aus dem Formular-Tag verschieben, diesen Fehler zu vermeiden.

Ich hatte das gleiche Problem, wenn eine List Modifizierung mit Hilfe von JavaScript auf dem Client. Es tritt auf, wenn Sie neue Elemente in der List-Box aus dem Client hinzufügen, die nicht da waren, als die Seite gerendert wurde.

Das Update, das ich gefunden ist das Ereignis Validierungssystem aller möglichen gültigen Elemente zu informieren, die vom Client hinzugefügt werden können. Sie tun dies, indem Page.Render überschrieben und für jeden Wert Aufruf Page.ClientScript.RegisterForEventValidation, dass Ihr JavaScript in das 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 von potentiell gültigen Werten für das Listenfeld haben. In meinem Fall wurde ich Elemente zwischen zwei Listboxen zu bewegen - ein, dass alle möglichen Werte hat und eine andere, die zunächst leer, aber wird mit einer Teilmenge der Werte von der ersten in JavaScript, wenn der Benutzer auf eine Schaltfläche klickt ausgefüllt. In diesem Fall brauchen Sie nur durch die Elemente in der ersten ListBoxand jedes Register mit dem zweiten Listenfeld wiederholen:

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

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

Ie.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation Schlüssel aus dem Attribut System.Web.UI.SupportsEventValidation, wenn Sie es eine Unterklasse, sofern Sie es nicht explizit in hinzufügen zurück, es wird nie die Validierung Routine aufrufen. Das funktioniert mit jeder Kontrolle und ist der einzige Weg, die ich gefunden habe, um „abzuschalten“ es auf einer Steuerung durch die Steuerbasis (dh nicht auf Seitenebene).

  

3: änderte ich meinen Knopf in Gitter   Spalte von „Drück-Knopf“ zu   „Linkbutton“. Es funktionierte!   ( „Button =“ Linkbutton ") Ich denke, wenn   Sie können Ihre Taste zu anderen ändern   Kontrollen wie „Linkbutton“ in anderen   Fälle wäre es richtig funktionieren.

Ich wünsche, ich könnte Sie vote up, Amir (ach mein rep ist zu niedrig.) Ich war gerade mit diesem Problem und die Veränderung dieses wie ein Champion auf meinem gridview gearbeitet. Nur ein wenig beiseite, ich denke, der gültige Code ist: Button = „Link“

Ich vermute, das liegt daran, dass, wenn Sie auf ‚Bearbeiten‘, deine Bearbeitung Änderungen ‚update‘ und ‚Abbrechen‘, die dann wieder auf ‚Bearbeiten‘ ändern unterbreiten. Und diese Verschiebung Kontrollen machen .net unruhig.

(1) EnableEventValidation = "false" ................... Es ist nicht für mich arbeiten.

(2) ClientScript.RegisterForEventValidation .... Es ist nicht für mich arbeiten.

Lösung 1:

Ändern Knopf / Image auf Linkbutton in Gridview. Es klappt. (Aber Ich mag Image)

Forschung: Button / Image und Linkbutton verschiedene Methoden verwenden, um Postback

Originalartikel:

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

Lösung 2:

In OnInit (), geben Sie den Code so etwas wie diese eindeutige ID setzen für Button / Image:

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

Original Artikel:

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

Sie versuchen, so etwas wie das, in Ihrer ASPX-Seite

hinzufügen

  

EnableEventValidation = "false"

Sie fühlen sich frei, jede Frage zu stellen!

Wenn Sie die Dropdownlist durch Client-seitiges Script füllen dann die Liste löschen, bevor Sie das Formular zurück an den Server übermitteln; dann wird ASP.NET nicht beschweren und die Sicherheit wird noch eingeschaltet sein.

Und die Daten aus der DDL ausgewählt erhalten, können Sie ein „OnChange“ Ereignis an den DDL befestigen Sie den Wert in einem versteckten Eingang oder in einem Textfeld mit Style = sammeln „display: none;“

implementiert ich eine verschachtelte Rasteransicht und sah ich das gleiche Problem .Ich Linkbutton wie diese anstelle von Bild-Taste verwendet:

, bevor ich hatte eine Spalte wie folgt aus:

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

Ich habe wie diese 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> 

Ich hatte ein ähnliches Problem, aber ich wurde mit ASP.Net nicht 1.1 noch eine Kontrolle über Javascript zu aktualisieren. Mein Problem trat nur auf Firefox und nicht auf IE (!).

Ich habe die Optionen für einen Dropdownlist auf dem PreRender Ereignisse wie folgt:

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

Meine "HF" (Hidden) hatte die von der Newline getrennte Optionen, wie folgt aus:

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

Das Problem war, dass die HTML-Seite gebrochen war (ich hatte meine Zeilenumbrüche) über die Optionen des „select“, die die DropDown vertreten.

So beschloß ich meine mein Problem das Hinzufügen einer Zeile:

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

Hope diese Hilfe jemand.

Wenn Sie UseSubmitBehavior="True" ändern Ihr Problem gelöst werden, um UseSubmitBehavior="False"

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

Ich habe das gleiche Problem habe, was ich getan habe:

haben soeben einen Zustand if(!IsPostBack) und es funktioniert gut:)

Dieser Fehler wird ohne Postbacks zeigen

Fügen Sie den Code ein:

If(!IsPostBack){

 //do something

}

In diesem Fall ID die Schaltfläche in RowDataBound des Gitters hinzuzufügen. Es wird Ihr Problem lösen.

Eine einfache Lösung für dieses Problem ist die IsPostBack zu verwenden, auf Ihrer Seite zu laden überprüfen. Das wird dieses Problem lösen.

Ajax Update ist es, und ich denke, es ist die am einfachsten Art und Weise, ohne auf das Ajax Postbacks oben.

Ich weiß, dass dies eine super-alte Post ist. Unter der Annahme, dass Sie in Ihre Anwendung aufrufen, hier ist eine Idee, die für mich gearbeitet hat:

  1. Implementieren Sie die ICallbackEventHandler auf Ihrer Seite
  2. Anruf ClientScriptManager.GetCallbackEventReference Ihre Server-Seite Code aufzurufen
  3. Wie die Fehlermeldung besagt, könnten Sie dann rufen ClientScriptManager.RegisterForEventValidation

Wenn Sie nicht die totale Kontrolle benötigen, können Sie ein Update-Panel verwenden, die dies für Sie tun würde.

Wir liefen in das gleiche Problem, wenn wir unsere regelmäßigen ASPX-Seiten Inhalt Seiten wurden zu konvertieren.

Die Seite mit diesem Thema hatte einen </form> Tag in einer der Inhaltsabschnitte, also zwei Form Endtags wurden zur Laufzeit gerendert, die dieses Problem verursacht. Das Entfernen der zusätzlichen Form End-Tag von der Seite dieses Problem behoben.

Vier Minuten vor erhielt ich den gleichen Fehler. Dann habe ich während einer halben Stunde, wie Sie recherchiert. In allen Foren sagen sie in der Regel „Seite EnableEvent hinzufügen .. = false oder true“. Jede Lösung vorgeschlagen habe meine Probleme nicht gelöst, bis ich es gefunden. Das Problem ist leider eine ASP.NET-Taste. Ich entfernte sie zwei Sekunden. Ich habe versucht, mit „Imagebutton“ zu ersetzen, aber es war auch nicht akzeptabel (weil es den gleichen Fehler gegeben hat).

Schließlich habe ich mit LinkButton ersetzt. es scheint zu funktionieren!

Ich war mit Datalist und ich war für meine Push-Taste, um den gleichen Fehler. Ich benutze IsPostBack nur zu überprüfen und meine Kontrollen zu füllen, und das Problem ist gelöst! Great !!!

Was für mich gearbeitet bewegt den folgenden Code aus page_load zu 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>");
}

Die beste Option zu tun verstecktes Feld ist zu verwenden und deaktivieren Sie nicht die Ereignisvalidierung, auch jede Listbox ändern, Dropdownlist mit Runat Server-Attribute, um

Wenn Sie Ajax Update-Panel verwenden. In <Triggers> Tag und in ihm die Taste auslösen oder steuern wodurch die Postbacks mit <asp:PostBackTrigger .../>

Wenn Sie Front die Daten wissen, bis die aufgefüllt werden konnte, können Sie die ClientScriptManager, um dieses Problem zu lösen. Ich hatte dieses Problem beim dynamisch auf einer vorherigen Benutzerauswahl ein Drop-Down-Box mit Hilfe von Javascript bevölkern.

Hier ist ein Beispiel-Code für das Überschreiben der Methode machen (in VB und C #) und einen potenziellen Wert für die Dropdownlist ddCar erklärt.

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:. Diese in der Code-behind-Datei gehen sollten (.vb oder CS-), oder wenn in der aspx-Datei verwendet werden, können Sie in <script> Tags wickeln

Dies war der Grund, warum ich es war immer:

Ich hatte eine ASP: ListBox. Ursprünglich wurde es versteckt. Auf Client-Seite würde ich es über AJAX mit Optionen füllen. Der Benutzer hat eine Option. Dann, wenn die Schaltfläche Senden klicken, würde der Server alle lustig über die List-Box bekommen, da sie es sich nicht erinnern, wurden keine Optionen hat.

Also, was ich tat ist sicherzustellen, dass ich alle Listenoptionen löschen, bevor Sie das Formular zurück an den Server. Auf diese Weise der Server beschwerte sich nicht, da die Liste an den Client ging leer und es kam wieder leer.

Sortiert !!!

Wie Nick B und sagte, dass für mich gearbeitet Sie Zeilenumbrüche in einigen Fällen zu entfernen haben. Werfen Sie einen Blick auf den Code:

-Falscher Art und Weise:

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

-Rechts Art und Weise:

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

Es ocurred nur für mich in IE10 +

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top