Argumento de devolución de llamada o devolución de llamada no válido. La validación de eventos se habilita usando '< pages enableEventValidation = & # 8220; true & # 8221; / >'

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

Pregunta

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 solucionamos esto?

Detalles de error a continuación:

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
¿Fue útil?

Solución

El problema es que ASP.NET no conoce este elemento de lista extra o eliminado. Tienes una serie de opciones (enumeradas a continuación):

  • Deshabilite la validación de eventos (mala idea, porque pierde un poco de seguridad que conlleva muy poco costo).
  • Utilice 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 manera, las actualizaciones de los campos de estado de vista y los campos relacionados pasarán a la validación de eventos).
  • Olvídese del lado del cliente y use la devolución de datos clásica y agregue o elimine el lado del servidor de listas.

Espero que esto ayude.

Otros consejos

¿Tienes códigos en tus eventos Page_Load? Si es así, entonces tal vez agregando lo siguiente ayude.

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

Este error se produce al hacer clic en su comando y la carga de página se está ejecutando nuevamente, en un ciclo de vida normal será Carga de página - > Haga clic en Comando - > Carga de página (otra vez) - > Procesar evento de comando de elemento

Tuve una experiencia con DataGrid. Una de sus columnas era " Seleccionar " botón. Cuando estaba haciendo clic en " Seleccionar " botón de cualquier fila que había recibido este mensaje de error:

  

" Argumento de devolución de llamada o devolución de llamada no válido. La validación de eventos se habilita usando en la configuración o       <% @ Page EnableEventValidation = " true " % > en una pagina Por razones de seguridad, esta característica verifica que los argumentos de la devolución o       los eventos de devolución de llamada se originan en el control del servidor que originalmente los representó. Si los datos son válidos y esperados, use el       Método ClientScriptManager.RegisterForEventValidation para registrar los datos de devolución o devolución de llamada para validación. & Quot;

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

1) Cambié el atributo de página por EnableEventValidation = " false " . Pero no funcionó. (no solo es peligroso    por razones de seguridad, no se llamó a mi controlador de eventos: void Grid_SelectedIndexChanged (remitente del objeto, 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é mi tipo de botón en la columna de la cuadrícula de PushButton a LinkButton . ¡Funcionó! (" ButtonType = " LinkButton "). Creo que si puedes cambiar tu botón a otros controles como " LinkButton " en otros casos, funcionaría correctamente.

Realmente querrás hacer 2 o 3, no deshabilites la validación de eventos.

Hay dos problemas principales con la adición de elementos a un lado del cliente asp: listbox.

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

  • La segunda es que incluso si deshabilita la validación de eventos, cuando su página se vuelva a publicar, los elementos en el cuadro de lista se reconstruirán desde el estado de visualización, por lo que se perderán los cambios realizados en el cliente. La razón de esto es que asp.net no espera que el contenido de un cuadro de lista se modifique en el cliente, solo espera que se realice una selección, por lo que descarta los cambios que haya realizado.

Lo más probable es que la mejor opción use un panel de actualización como se ha recomendado. Otra opción, si realmente necesita hacer este lado del cliente, es usar un < select > antiguo en lugar de un < asp: ListBox > , y mantener Su lista de elementos en un campo oculto. Cuando la página se presenta en el cliente, puede rellenarla a partir de una parte del contenido de su campo de texto.

Luego, cuando esté listo para publicarlo, vuelva a llenar el contenido del campo oculto desde su < select > modificado. Luego, por supuesto, debe dividir eso nuevamente en el servidor y hacer algo con sus elementos, ya que su selección está vacía ahora que está nuevamente en el servidor.

En general, es una solución bastante incómoda que realmente no recomendaría, pero si realmente tiene que hacer modificaciones en el lado del cliente de un listBox, funciona. Sin embargo, realmente recomendaría que mires un updatePanel antes de tomar esta ruta.

Tuve el mismo problema con un Repetidor porque tenía una página web con un control de Repetidor en un sitio web que tenía habilitada la habilitación para la verificación de eventos. No era bueno Estaba obteniendo excepciones relacionadas con la devolución de datos no válidas.

Lo que funcionó para mí fue establecer EnableViewState = " false " para el repetidor. 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 alcance es mucho menor que desactivar la validación de eventos para cualquiera.

Nada de lo anterior 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.

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

Tenga en cuenta que recientemente ASP.NET ha comenzado a considerar iframes dentro de una etiqueta de formulario que contiene una etiqueta de formulario en el documento de iframe como un marco anidado. 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. Ocurre cuando agrega nuevos elementos al ListBox desde el cliente que no estaban allí cuando se representó la página.

La solución que encontré es informar al sistema de validación de eventos de todos los elementos válidos posibles que se pueden agregar desde el cliente. Para ello, invalide 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 un gran número de valores potencialmente válidos para el cuadro de lista. En mi caso, movía elementos entre dos ListBoxes, uno que tiene todos los valores posibles y otro que inicialmente está vacío pero se rellena con un subconjunto de los valores del primero en JavaScript cuando el usuario hace clic en un botón. En este caso, solo necesita recorrer los elementos del primer ListBox y 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 no mencionada aquí es subclase ListBox

Es decir.

public class ListBoxNoEventValidation : ListBox 
{
}

Las claves ClientEventValidation están fuera del atributo System.Web.UI.SupportsEventValidation, si lo subclasifica, a menos que lo agregue de nuevo explícitamente, nunca llamará a la rutina de validación. Eso funciona con cualquier control, y es la única forma que he encontrado para " deshabilitar " en una base de control por control (es decir, no a nivel de página).

  

3: cambié mi tipo de botón en la cuadrícula   columna de " PushButton " a   " LinkButton " ;. ¡Funcionó!   (" ButtonType = " LinkButton ") Creo que si   Puedes cambiar tu botón a otro   controles como " LinkButton " en otra   casos, funcionaría correctamente.

Desearía poder votar, Amir (lamentablemente mi reputación es demasiado baja). Estaba teniendo este problema y cambiar esto funcionó como un campeón en mi vista de cuadrícula. Aparte de eso, creo que el código válido es: ButtonType = " Link "

Sospecho que esto se debe a que al hacer clic en 'editar', su edición cambia a 'actualizar' y 'cancelar', que luego vuelve a 'editar' al enviar. Y estos controles cambiantes hacen que .net sea incómodo.

(1) EnableEventValidation = " false " ................... No me funciona.

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

Solución 1:

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

Investigación: Button / ImageButton y LinkButton utilizan 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 de esta manera para establecer una ID ú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/

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

añadir

  

EnableEventValidation = " false "

¡siéntete libre de hacer cualquier pregunta!

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

Y para obtener los datos seleccionados de la DDL, puede adjuntar un " OnChange " evento a la DDL para recopilar el valor en una entrada oculta o en un cuadro de texto con Estilo = " mostrar: ninguno; "

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

antes de tener una columna como esta:

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

He reemplazado de esta manera.

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

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 un DropDownList en el evento PreRender como este:

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 fue que la página HTML estaba rota (me refiero a nuevas líneas) en las opciones de " seleccionar " que representaba el DropDown.

Así que resolví mi problema agregando 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.

si cambia UseSubmitBehavior = " True " a UseSubmitBehavior = " False " su problema se resolverá

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

He tenido el mismo problema, lo que hice:

Acaba de agregar una condición if (! IsPostBack) y funciona bien :)

Este error se mostrará sin devolución de datos

Añadir código:

If(!IsPostBack){

 //do something

}

En este caso, agregue id al botón en RowDataBound de la cuadrícula. Resolverá tu problema.

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

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

Sé que este es un post super viejo. Suponiendo 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 al código del lado de su servidor
  3. Como indica el mensaje de error, puede llamar a ClientScriptManager.RegisterForEventValidation

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

Nos encontramos con este mismo problema cuando convertimos nuestras páginas ASPX normales a páginas de Contenido.

La página con este problema tenía una etiqueta < / form > dentro de una de las secciones de Contenido, por lo tanto, dos etiquetas de fin de formulario se representaron en el tiempo de ejecución que causó este problema. La eliminación de la etiqueta final de formulario adicional de la página resolvió este problema.

Hace cuatro minutos recibí el mismo error. Entonces he investigado durante media hora como tú. En todos los foros, generalmente dicen "agregar página enableEvent ... = false o true". Cualquier solución propuesta no resolvió mis problemas hasta que la encontré. El problema es desafortunadamente un botón ASP.NET. Lo quité hace dos segundos. Intenté reemplazarlo con " imagebutton " ;, pero también fue inaceptable (porque dio el mismo error).

Finalmente he reemplazado con LinkButton . ¡Parece estar funcionando!

Estaba usando datalist y estaba recibiendo el mismo error para mi botón pulsador. ¡Solo uso IsPostBack para verificar y completar mis controles y el problema está resuelto! Genial !!!

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, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

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 de ejecución

Si está utilizando el panel de actualización de Ajax. Agregue la etiqueta < Triggers > y dentro de ella active el Botón o control que causa el postBack usando < asp: PostBackTrigger ... / >

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

Aquí hay un código de ejemplo para anular el método de renderizació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 principiantes: debe ir en el código detrás del archivo (.vb o .cs) o, si se usa en el archivo aspx, puede incluir las etiquetas < script > .

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

Tuve un ASP: ListBox. Inicialmente estaba oculto. En el lado del cliente lo rellenarí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 gracioso con el ListBox, ya que no recordaba que tuviera ninguna opción.

Entonces, lo que hice fue asegurarme de que borro todas las opciones de la lista antes de enviar el formulario al servidor. De esa manera, el servidor no se quejó ya que la lista se envió al cliente vacía y se volvió vacía.

¡Ordenado!

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

-Muy mal:

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

-En forma correcta:

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

Solo me ocurrió en IE10 +

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top