Argomento postback o callback non valido. La convalida dell'evento è abilitata usando '< pages enableEventValidation = & # 8220; true & # 8221; / >'

StackOverflow https://stackoverflow.com/questions/228969

Domanda

Ricevo il seguente errore quando riporto una pagina dal lato client. Ho un codice JavaScript che modifica un asp: ListBox sul lato client.

Come possiamo risolvere questo problema?

Dettagli dell'errore di seguito:

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
È stato utile?

Soluzione

Il problema è che ASP.NET non viene a conoscenza di questo elenco extra o rimosso. Hai un numero di opzioni (elencate di seguito):

  • Disabilita eventvalidation (cattiva idea, perché perdi un po 'di sicurezza con un costo molto basso).
  • Utilizza ASP.NET Ajax UpdatePanel. (Metti la casella di riepilogo nel Pannello di aggiornamento e attiva un aggiornamento, se aggiungi o rimuovi la casella di riepilogo. In questo modo viewstate e i campi correlati ottengono aggiornamenti e passerà la convalida dell'evento.)
  • Dimentica il lato client e usa il postback classico e aggiungi o rimuovi gli elenchi dal lato server.

Spero che questo aiuti.

Altri suggerimenti

Hai dei codici negli eventi Page_Load? se sì, forse aggiungendo quanto segue sarà di aiuto.

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

Questo errore viene generato quando si fa clic sul comando e il Page_load viene eseguito nuovamente, in un normale ciclo di vita sarà Page_Load - > Fai clic su Comando - > Page_Load (di nuovo) - > Elaborazione evento ItemCommand

Ho avuto un'esperienza con DataGrid. Una delle sue colonne era " Seleziona " pulsante. Quando stavo facendo clic su " Seleziona " pulsante di qualsiasi riga che avevo ricevuto questo messaggio di errore:

  

" Argomento postback o callback non valido. La convalida dell'evento è abilitata usando in configurazione o       <% @ Page EnableEventValidation = " true " % & Gt; in una pagina. Per motivi di sicurezza, questa funzione verifica che gli argomenti postback o       gli eventi di callback provengono dal controllo server che li ha originariamente resi. Se i dati sono validi e previsti, utilizzare il       Metodo ClientScriptManager.RegisterForEventValidation per registrare i dati di postback o callback per la convalida. & Quot;

Ho cambiato diversi codici e alla fine ci sono riuscito. Percorso della mia esperienza:

1) Ho modificato l'attributo della pagina in EnableEventValidation = " false " . Ma non ha funzionato. (non solo è pericoloso    per motivi di sicurezza, il mio gestore eventi non è stato chiamato: void Grid_SelectedIndexChanged (mittente oggetto, EventArgs e)

2) Ho implementato ClientScript.RegisterForEventValidation nel metodo Render. Ma non ha funzionato.

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) Ho cambiato il mio tipo di pulsante nella colonna della griglia da PushButton a LinkButton . Ha funzionato! (" ButtonType = " LinkButton "). Penso che se puoi cambiare il tuo pulsante con altri controlli come " LinkButton " in altri casi, funzionerebbe correttamente.

Avrai davvero voglia di fare 2 o 3, non disabilitare la convalida dell'evento.

Esistono due problemi principali con l'aggiunta di elementi a un asp: lato client listbox.

  • Il primo è che interferisce con la convalida dell'evento. Ciò che è tornato al server non è quello che ha inviato.

  • Il secondo è che anche se si disabilita la convalida dell'evento, quando la pagina viene posticipata, gli elementi nella casella di riepilogo verranno ricostruiti dal viewstate, quindi tutte le modifiche apportate sul client andranno perse. La ragione di ciò è che un asp.net non si aspetta che il contenuto di una casella di riepilogo venga modificato sul client, si aspetta solo che venga effettuata una selezione, quindi scarta tutte le modifiche che potresti aver apportato.

È molto probabile che l'opzione migliore utilizzi un pannello di aggiornamento come è stato raccomandato. Un'altra opzione, se hai davvero bisogno di fare questo lato client, è usare un semplice < select > invece di un < asp: ListBox > e mantenere il tuo elenco di elementi in un campo nascosto. Quando il rendering della pagina sul client è possibile popolarlo da una divisione del contenuto del campo di testo.

Quindi, quando sei pronto per pubblicarlo, ripopoli i contenuti del campo nascosto dal modificato < seleziona > . Quindi, ovviamente, devi dividerlo di nuovo sul server e fare qualcosa con i tuoi oggetti, poiché la tua selezione è vuota ora che è di nuovo sul server.

Tutto sommato è una soluzione piuttosto ingombrante che non consiglierei davvero, ma se devi davvero fare modifiche sul lato client di un listBox, funziona. Consiglio vivamente di consultare un updatePanel prima di intraprendere questa strada.

Ho avuto lo stesso problema con un ripetitore perché avevo una pagina web con un controllo ripetitore in un sito Web con EnableEventValidation attivato. Non era buono Stavo ricevendo eccezioni correlate al postback non valide.

Ciò che ha funzionato per me è stato impostare EnableViewState = " false " per il ripetitore. I vantaggi sono che è più semplice da usare, semplice come disattivare la convalida degli eventi per il sito Web o la pagina Web, ma l'ambito è molto meno che disattivare la convalida degli eventi per entrambi.

Nessuna delle precedenti ha funzionato per me. Dopo ulteriori approfondimenti mi sono reso conto di aver trascurato 2 moduli applicati sulla pagina che causava il problema.

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

Tenere presente che recentemente ASP.NET ha iniziato a considerare iframe all'interno di un tag modulo che contiene un tag modulo nel documento iframe stesso come frame nidificato. Ho dovuto spostare l'iframe dal tag del modulo per evitare questo errore.

Ho avuto lo stesso problema durante la modifica di un ListBox utilizzando JavaScript sul client. Si verifica quando si aggiungono nuovi elementi a ListBox dal client che non erano presenti al momento del rendering della pagina.

La correzione che ho trovato è di informare il sistema di validazione degli eventi di tutti i possibili elementi validi che possono essere aggiunti dal client. Puoi farlo sovrascrivendo Page.Render e chiamando Page.ClientScript.RegisterForEventValidation per ogni valore che il tuo JavaScript potrebbe aggiungere alla casella di riepilogo:

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

Questo può essere un po 'una seccatura se hai un gran numero di valori potenzialmente validi per la casella di riepilogo. Nel mio caso stavo spostando gli elementi tra due ListBox - uno che ha tutti i valori possibili e un altro che inizialmente è vuoto ma viene riempito con un sottoinsieme dei valori dal primo in JavaScript quando l'utente fa clic su un pulsante. In questo caso devi solo scorrere gli elementi nel primo ListBox e registrarli ciascuno con la seconda casella di riepilogo:

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

Un altro modo non menzionato qui è la sottoclasse ListBox

Ie.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation disattiva l'attributo System.Web.UI.SupportsEventValidation se lo esegui in una sottoclasse, a meno che non lo ricolleghi esplicitamente, non chiamerà mai la routine di convalida. Funziona con qualsiasi controllo ed è l'unico modo in cui ho trovato " disabilitato " su un controllo per controllo (vale a dire, non a livello di pagina).

  

3: ho cambiato il mio tipo di pulsante nella griglia   colonna da " Pulsante " a   & Quot; LinkButton " ;. Ha funzionato!   (" ButtonType = " LinkButton ") Penso se   puoi cambiare il tuo pulsante in altro   controlli come " LinkButton " in altro   casi, funzionerebbe correttamente.

Vorrei poterti votare, Amir (purtroppo il mio rappresentante è troppo basso.) Stavo avendo questo problema e cambiarlo ha funzionato come un campione sulla mia griglia. Solo un po 'a parte, penso che il codice valido sia: ButtonType = " Link "

Sospetto che ciò sia dovuto al fatto che quando si fa clic su "modifica", la modifica viene modificata in "aggiorna" e "annulla", per poi tornare a "modifica" al momento dell'invio. E questi controlli di spostamento rendono .net inquieto.

(1) EnableEventValidation = " false " ................... Non funziona per me.

(2) ClientScript.RegisterForEventValidation .... Non funziona per me.

Soluzione 1:

Cambia Button / ImageButton in LinkButton in GridView. Funziona. (Ma mi piace ImageButton)

Ricerca: Button / ImageButton e LinkButton utilizzano diversi metodi per postback

Articolo originale:

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

Soluzione 2:

In OnInit (), inserisci qualcosa di simile al codice per impostare un ID univoco per 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();           
  }
}

Articolo originale:

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

provi qualcosa del genere, nella tua pagina aspx

aggiungi

  

EnableEventValidation = " falsa "

ti senti libero di porre qualsiasi domanda!

Se compili l'elenco a discesa tramite lo script lato client, cancella l'elenco prima di inviare il modulo al server; quindi ASP.NET non si lamenterà e la sicurezza sarà ancora attiva.

E per ottenere i dati selezionati dal DDL, puoi allegare un " OnChange " evento al DDL per raccogliere il valore in un input nascosto o in una casella di testo con Style = " display: none; "

Ho implementato una vista griglia nidificata e ho riscontrato lo stesso problema. Ho usato LinkButton invece del pulsante immagine in questo modo:

prima avevo una colonna come questa:

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

Ho sostituito in questo modo.

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

Ho avuto un problema simile, ma non stavo usando ASP.Net 1.1 né aggiornando un controllo tramite JavaScript. Il mio problema si è verificato solo su Firefox e non su IE (!).

Ho aggiunto opzioni a un elenco a discesa sull'evento PreRender in questo modo:

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

Mio " HF " (campo nascosto) aveva le opzioni separate dalla nuova riga, in questo modo:

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

Il problema era che la pagina HTML era spezzata (voglio dire aveva delle righe) sulle opzioni di " seleziona " che rappresentava il DropDown.

Quindi ho risolto il mio problema aggiungendo una riga:

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

Spero che questo aiuti qualcuno.

se cambi UseSubmitBehavior = " True " in UseSubmitBehavior = " False " il tuo problema sarà risolto

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

Ho avuto lo stesso problema, quello che ho fatto:

Ho appena aggiunto una condizione if (! IsPostBack) e funziona bene :)

Questo errore verrà visualizzato senza postback

Aggiungi codice:

If(!IsPostBack){

 //do something

}

In questo caso aggiungi id al pulsante in RowDataBound della griglia. Risolverà il tuo problema.

Una soluzione semplice per questo problema è utilizzare il IsPostBack sul caricamento della pagina. Ciò risolverà questo problema.

Ajax UpdatePanel ce la fa, e penso che sia il modo più semplice , ignorando il postback Ajax .

So che questo è un post molto vecchio. Supponendo che tu stia chiamando nella tua applicazione, ecco un'idea che ha funzionato per me:

  1. Implementa ICallbackEventHandler sulla tua pagina
  2. Chiama ClientScriptManager.GetCallbackEventReference per chiamare il tuo codice lato server
  3. Come indicato dal messaggio di errore, è possibile quindi chiamare ClientScriptManager.RegisterForEventValidation

Se non hai bisogno del controllo totale, puoi utilizzare un pannello di aggiornamento che lo farebbe per te.

Abbiamo riscontrato questo stesso problema durante la conversione delle nostre normali pagine ASPX in pagine di contenuti.

La pagina con questo problema presentava un tag < / form > all'interno di una delle sezioni Contenuto, pertanto sono stati visualizzati due tag di fine modulo in fase di esecuzione che hanno causato questo problema. La rimozione del tag di fine modulo aggiuntivo dalla pagina ha risolto questo problema.

Quattro minuti fa ho ricevuto lo stesso errore. Poi ho fatto ricerche per mezz'ora come te. In tutti i forum generalmente dicono "aggiungi pagina enableEvent .. = false o true". Qualsiasi soluzione proposta non ha risolto i miei problemi fino a quando non l'ho trovata. Purtroppo il problema è un pulsante ASP.NET. L'ho rimosso due secondi fa. Ho provato a sostituire con "imagebutton", ma è stato anche inaccettabile (perché ha dato lo stesso errore).

Alla fine ho sostituito con LinkButton . sembra funzionare!

Stavo usando il datalist e stavo ottenendo lo stesso errore per il mio pulsante. Uso IsPostBack per controllare e riempire i miei controlli e il problema è risolto! Grande !!!

Ciò che ha funzionato per me è spostare il seguente codice da page_load a 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 migliore opzione da fare è utilizzare il campo nascosto e non disabilitare la convalida dell'evento, inoltre cambia ogni casella di riepilogo, elenco a discesa per selezionare con l'attributo runat server

Se si utilizza il pannello di aggiornamento Ajax. Aggiungi il tag < Triggers > e al suo interno attiva il pulsante o il controllo che causa il postback usando < asp: PostBackTrigger ... / >

Se si conoscono in anticipo i dati che potrebbero essere popolati, è possibile utilizzare ClientScriptManager per risolvere questo problema. Ho riscontrato questo problema durante il popolamento dinamico di una casella a discesa utilizzando JavaScript su una selezione utente precedente.

Ecco un esempio di codice per sovrascrivere il metodo di rendering (in VB e C #) e dichiarare un valore potenziale per l'elenco a discesa 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

o una leggera variazione in C # potrebbe essere:

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

Per i neofiti: questo dovrebbe andare nel codice dietro il file (.vb o .cs) o se usato nel file aspx è possibile racchiudere i tag < script > .

Questo era il motivo per cui lo stavo ottenendo:

Avevo un ASP: ListBox. Inizialmente era nascosto. Sul lato client lo popolerei tramite AJAX con opzioni. L'utente ha scelto un'opzione. Quindi, quando si fa clic sul pulsante Invia, il Server diventerebbe tutto molto divertente per ListBox, dal momento che non si ricordava che avesse alcuna opzione.

Quindi quello che ho fatto è assicurarmi di cancellare tutte le opzioni della lista prima di inviare il modulo al server. In questo modo il server non si è lamentato poiché l'elenco è andato al client vuoto ed è tornato vuoto.

Ordinato !!!

Come ha detto Nick B e ha funzionato per me, in alcuni casi è necessario rimuovere le interruzioni di riga. Dai un'occhiata al codice:

-Sbagliato modo:

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

-Destra:

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

Si è verificato solo per me in IE10 +

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top