No válido postback o argumento de callback. La validación de eventos se habilita usando ”

Recibo el siguiente error cuando publico una página del lado del cliente. Tengo un código JavaScript que modifica un asp: ListBox en el lado del cliente.

¿Cómo arreglamos esto?

Detalles de error a continuación:

Server Error in '/XXX' Application. -------------------------------------------------------------------------------- Invalid postback or callback argument. Event validation is enabled using  in configuration or  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  in configuration or  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  in configuration or  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 

El problema es que ASP.NET no llega a saber sobre este elemento de lista extra o eliminado. Usted tiene una serie de opciones (enumeradas a continuación):

  • Desactive la validación de eventos (mala idea, porque pierde un poco de seguridad que tiene un costo muy bajo).
  • Use ASP.NET Ajax UpdatePanel. (Coloque el cuadro de lista en el Panel de actualización y active una actualización, si agrega o elimina el cuadro de lista. De esta forma, viewstate y los campos relacionados obtienen actualizaciones y se aprueba la validación de evento).
  • Olvídese del lado del cliente y use la devolución de datos clásica y agregue o elimine el lado del servidor de listitems.

Espero que esto ayude.

¿Tiene códigos en sus eventos Page_Load? En caso afirmativo, quizás añadiendo lo siguiente ayudará.

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

Este error se produce cuando haces clic en tu comando y la carga de página se está ejecutando de nuevo, en un ciclo de vida normal será Page_Load -> Haz clic en Comando -> Page_Load (otra vez) -> Proceso Elemento Evento de comando

Tuve una experiencia con DataGrid. Una de sus columnas era el botón “Seleccionar”. Cuando estaba haciendo clic en el botón “Seleccionar” de cualquier fila, recibí este mensaje de error:

“Retraso no válido o argumento de callback. La validación de evento se habilita usando configuración o <% @ Página EnableEventValidation =" true "%> en una página. Por razones de seguridad, esta característica verifica que los argumentos para devolución de datos o eventos de callback se originan originalmente los emitió. Si los datos son válidos y esperados, utilice el método ClientScriptManager.RegisterForEventValidation para registrar la devolución de datos o los datos de callback para la validación “.

Cambié varios códigos, y finalmente lo logré. Mi ruta de experiencia:

1) Cambié el atributo de página a EnableEventValidation="false" . Pero no funcionó. (No solo es peligroso por razones de seguridad, mi controlador de eventos no fue llamado: void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) Implementé ClientScript.RegisterForEventValidation en el método Render. Pero no funcionó.

 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) Cambié el tipo de botón en la columna de cuadrícula de PushButton a LinkButton . ¡Funcionó! (“ButtonType =” LinkButton “). Creo que si puede cambiar su botón a otros controles como” LinkButton “en otros casos, funcionaría correctamente.

Realmente va a querer hacer 2 o 3, no deshabilite la validación de eventos.

Hay dos problemas principales al agregar elementos a un asp: lado del cliente de la lista.

  • El primero es que interfiere con la validación de eventos. Lo que regresó al servidor no es lo que envió.

  • El segundo es que, incluso si deshabilita la validación de eventos, cuando su página se publique, los elementos en el cuadro de lista se reconstruirán desde viewstate, por lo que se perderán los cambios que haya realizado en el cliente. El motivo es que asp.net no espera que el contenido de un listbox se modifique en el cliente, solo espera que se realice una selección, por lo que descarta los cambios que haya realizado.

La mejor opción es usar un panel de actualización como se ha recomendado. Otra opción, si realmente necesita hacer este lado del cliente, es usar un simple antiguo lugar de un , y para mantener su lista de elementos en un campo oculto. Cuando la página se representa en el cliente, puede completarla a partir de una división del contenido de su campo de texto.

Luego, cuando esté listo para publicarlo, volverá a llenar el contenido del campo oculto de su modificada. Luego, por supuesto, debe dividir nuevamente en el servidor y hacer algo con sus elementos, ya que su selección está vacía ahora que está de vuelta en el servidor.

En general, es una solución bastante engorrosa que realmente no recomendaría, pero si realmente tiene que hacer modificaciones al lado del cliente de un listBox, funciona. Sin embargo, realmente le recomendaría que busque en un panel de actualización antes de seguir esta ruta.

Tuve el mismo problema con un repetidor porque tenía una página web con un control Repeater en un sitio web que tenía activado EnableEventValidation. No fue bueno Recibía excepciones relacionadas con la devolución no válida.

Lo que funcionó para mí fue establecer EnableViewState = “false” para el Repeater. Las ventajas son que es más fácil de usar, tan simple como desactivar la validación de eventos para el sitio web o la página web, pero el scope es mucho menor que desactivar la validación de eventos para cualquiera de los dos.

Ninguno de los anteriores funcionó para mí. Después de más excavaciones, me di cuenta de que había pasado por alto 2 formularios aplicados en la página que causaba el problema.

  
...

Tenga en cuenta que recientemente ASP.NET comenzó a considerar iframes dentro de una etiqueta de formulario que contiene una etiqueta de formulario en el documento iframe en sí misma, un marco nested. Tuve que mover el iframe fuera de la etiqueta del formulario para evitar este error.

Tuve el mismo problema al modificar un ListBox usando JavaScript en el cliente. Se produce cuando agrega nuevos elementos al ListBox del cliente que no estaban allí cuando se procesó la página.

La solución que encontré es informar al sistema de validación de eventos de todos los posibles elementos válidos que se pueden agregar desde el cliente. Para ello, anule la opción Page.Render y llame a Page.ClientScript.RegisterForEventValidation para cada valor que su JavaScript pueda agregar al cuadro de lista:

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

Esto puede ser un poco molesto si tiene una gran cantidad de valores potencialmente válidos para el cuadro de lista. En mi caso, estaba moviendo elementos entre dos ListBoxes, uno que tiene todos los valores posibles y otro que está inicialmente vacío, pero se completa con un subconjunto de los valores del primero en JavaScript cuando el usuario hace clic en un botón. En este caso, solo necesita repetir los elementos en el primer ListBoxy registrar cada uno con el segundo cuadro de lista:

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

Otra forma que no se menciona aquí es subclase ListBox

Es decir.

 public class ListBoxNoEventValidation : ListBox { } 

ClientEventValidation desactiva el atributo System.Web.UI.SupportsEventValidation si lo subclase, a menos que lo vuelva a agregar explícitamente, nunca llamará a la rutina de validación. Eso funciona con cualquier control, y es la única forma que he encontrado para “desactivarlo” en un control por control (es decir, no a nivel de página).

3: Cambié el tipo de botón en la columna de la cuadrícula de “PushButton” a “LinkButton”. ¡Funcionó! (“ButtonType =” LinkButton “) Creo que si puede cambiar su botón a otros controles como” LinkButton “en otros casos, funcionaría correctamente.

Ojalá pudiera votarte, Amir (por desgracia, mi representante es demasiado bajo). Estaba teniendo este problema y cambiar esto funcionó como un campeón en mi gridview. Solo un poco a un lado, creo que el código válido es: ButtonType = “Link”

Sospecho que esto se debe a que cuando haces clic en “editar”, tu edición cambia a “actualizar” y “cancelar”, que luego vuelve a cambiar a “editar” al enviar. Y estos controles cambiantes hacen que .net se sienta incómodo.

(1) EnableEventValidation = “false” ………………. No funciona para mí.

(2) ClientScript.RegisterForEventValidation …. No funciona para mí.

Solución 1:

Cambiar botón / ImageButton a LinkButton en GridView. Funciona. (Pero me gusta ImageButton)

Investigación: Button / ImageButton y LinkButton usan diferentes métodos para la devolución de datos

Artículo original:

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

Solución 2:

En OnInit (), ingrese el código algo así para establecer una identificación única para 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(); } } 

Artículo original:

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

Si completa la lista desplegable a través del script del lado del cliente, borre la lista antes de volver a enviar el formulario al servidor; entonces ASP.NET no se quejará y la seguridad seguirá activada.

Y para obtener los datos seleccionados del DDL, puede adjuntar un evento “OnChange” al DDL para recostackr el valor en una entrada oculta o en un cuadro de texto con Style = “display: none;”

intenta algo así, en su página .aspx

añadir

EnableEventValidation = “false”

¡siéntase libre de hacer cualquier pregunta!

Implementé una vista de cuadrícula anidada y me enfrenté al mismo problema. He usado LinkButton en lugar de botón de imagen como este:

antes tenía una columna como esta:

      

Lo he reemplazado así

      

si cambia UseSubmitBehavior="True" a UseSubmitBehavior="False" su problema será resuelto

  

He tenido el mismo problema, lo que hice:

Acabo de agregar una condición if(!IsPostBack) y funciona bien 🙂

Tuve un problema similar, pero no estaba usando ASP.Net 1.1 ni actualizando un control a través de JavaScript. Mi problema solo ocurrió en Firefox y no en IE (!).

Agregué opciones a DropDownList en el evento PreRender de esta manera:

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

Mi “HF” (hiddenfield) tenía las opciones separadas por la nueva línea, como esta:

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

El problema era que la página HTML estaba rota (es decir, tenía líneas nuevas) en las opciones de “seleccionar” que representaba DropDown.

Así que resolví mi problema añadiendo una línea:

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

Espero que esto ayude a alguien.

En este caso, agregue id al botón en RowDataBound de la grilla. Solucionará tu problema.

Ajax UpdatePanel lo hace, y creo que es la forma más fácil , ignorando la sobrecarga de posback de Ajax .

Sé que esta es una publicación muy antigua. Asumiendo que está llamando a su aplicación, aquí hay una idea que me ha funcionado:

  1. Implemente el ICallbackEventHandler en su página
  2. Llame a ClientScriptManager.GetCallbackEventReference para llamar a su código del lado del servidor
  3. Como dice el mensaje de error, puede llamar a ClientScriptManager.RegisterForEventValidation

Si no necesita control total, podría usar un panel de actualización que lo haría por usted.

Nos encontramos con este mismo problema cuando estábamos convirtiendo nuestras páginas regulares de ASPX en páginas de contenido.

La página con este problema tenía una etiqueta dentro de una de las secciones de contenido, por lo tanto, se procesaron dos tags de fin de formulario en el tiempo de ejecución que causaron este problema. La eliminación de la etiqueta de final de formulario adicional de la página resolvió este problema.

Este error se mostrará sin devolución de datos

Agregar código:

 If(!IsPostBack){ //do something } 

Hace cuatro minutos recibí el mismo error. Luego he investigado durante media hora como usted. En todos los foros, generalmente dicen “agregar página enableEvent .. = falso o verdadero”. Cualquier solución propuesta no resolvió mis problemas hasta que lo encontré. Desafortunadamente, el problema es un botón ASP.NET. Lo eliminé hace dos segundos. Traté de reemplazarlo con “imagebutton”, pero también era inaceptable (porque daba el mismo error).

Finalmente lo he reemplazado con LinkButton . ¡Parece estar funcionando!

Una solución simple para este problema es usar la verificación de IsPostBack en la carga de su página. Eso resolverá este problema.

Estaba usando datalist y estaba obteniendo el mismo error para mi botón. ¡Solo uso IsPostBack para verificar y llenar mis controles y el problema está resuelto! ¡¡¡Estupendo!!!

Lo que funcionó para mí es mover el siguiente código de 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, ""); } 

La mejor opción para hacer es usar el campo oculto y no deshabilitar la validación de eventos, también cambiar cada cuadro de lista, lista desplegable para seleccionar con el atributo de servidor runat

Si está utilizando el panel de actualización Ajax. Agregue la etiqueta y dentro de ella active el Botón o control que causa el postBack usando

Si conoce por adelantado los datos que podrían rellenarse, puede usar ClientScriptManager para resolver este problema. Tuve este problema al rellenar dinámicamente un cuadro desplegable utilizando javascript en una selección de usuario anterior.

Aquí hay un código de ejemplo para anular el método de representación (en VB y C #) y declarar un valor potencial para la lista desplegable 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 

o una ligera variación en C # podría ser:

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

Para los novatos: esto debe ir en el código detrás del archivo (.vb o .cs) o si se usa en el archivo aspx, puede envolverlo en las tags .

Esta fue la razón por la que lo estaba obteniendo:

Tenía un ASP: ListBox. Inicialmente estaba escondido. En el lado del cliente lo poblaría a través de AJAX con opciones. El usuario eligió una opción. Luego, al hacer clic en el botón Enviar, el Servidor se volvería completamente gracioso con el ListBox, ya que no recordaba tener ninguna opción.

Entonces, lo que hice fue asegurarme de borrar todas las opciones de la lista antes de volver a enviar el formulario al servidor. De esa forma, el servidor no se quejó porque la lista fue para el cliente vacía y volvió vacía.

Ordenado !!!

Como dijo Nick B y eso funcionó para mí, en algunos casos debes eliminar los saltos de línea. Eche un vistazo al código:

-Camino equivocado:

   Item 1  Item 2  Item 3  

-Manera correcta:

  Item 1 Item 2 Item 3  

Solo ocurrió para mí en IE10 +