2010-08-03 29 views
5

tengo una página web con varios controles. Dos de ellos son listas desplegables. La primera lista desplegable se llena desde un archivo xml en el evento page_load. Esto funciona bien A la primera lista desplegable se adjunta un extensor de lista desplegable en cascada que llama a un servicio web cada vez que se cambia la selección en la primera lista desplegable. Esto funciona bien también. Debajo de mis dos listas desplegables tengo un botón que publica la página. Sin embargo, cuando he hecho una selección en la segunda lista desplegable y haga clic en el botón me sale el siguiente error:No válido postback o argumento de devolución de llamada. Al hacer clic en el botón

Server Error in '/' Application. Invalid postback or callback argument. Event validation is enabled using 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 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 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) +10945696 System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) +72 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +507 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2071

Lo siento por la terrible formato. ¿Alguna sugerencia sobre por qué se produce este error y cómo prevenirlo?

Gracias,
Ben

Respuesta

3

Acabo de encontrar la respuesta a mis propias preguntas.

El problema es que AJAX agrega los nuevos valores a la lista desplegable, pero como no están en el estado de vista ASP.NET se detiene con un error. Hay una gran entrada de blog aquí que explica cómo resolver este problema, funcionó muy bien para mí.

Básicamente, usted subclase la clase dropdownlist que se deshace del atributo SupportsEventValidation -> ASP.NET ya no valida los valores y todo funciona bien!

Leer todo el post aquí: Subclassing the DropDownList to remove the SupportsEventValidation attribute

+0

Una solución ingeniosa, pero aún así, IMO. no intentes y "hackear" algo que ya es hacky (es decir, el CDDL). Aún así, tu llamada. =) – RPM1984

+0

Eché un vistazo a hacerlo con los paneles de actualización pero me quedé atascado. Me gustaría cambiar el texto de la segunda lista desplegable a "Cargando ..." mientras la lógica de fondo está buscando los valores. Lo estoy haciendo con un cambio de javascript adjunto a la primera lista desplegable. Sin embargo, el texto cambia bien pero la devolución de datos parece interrumpirse y no se cargan valores. ¿Alguna idea de como solucionar esto? – b3n

+0

estoy haciendo exactamente lo mismo. Tengo un menú desplegable: seleccione estado. cuando eligen un estado, un segundo menú desplegable obtiene el texto configurado en "Cargando ciudades ...", realiza una llamada ajax a un servicio web, lo vincula al menú desplegable. todos usan jquery y una llamada de servicio web. (evento de cambio de 1st ddl). para hacerlo en segundo plano, deberá llamar al servicio web de forma asincrónica, proporcionando una función de devolución de llamada; luego, en la función de devolución de llamada, borre el texto de carga y enlace los valores. – RPM1984

3

Es un problema conocido con el extensor deAJAX CascadingDropDown.

Para que funcione correctamente, debe desactivar la validación de eventos.

He aquí una línea de discusión del tema: http://forums.asp.net/t/1032053.aspx

que tenían el mismo problema, es por eso que abandoné usando el extensor CascadingDropDown regular y sólo utilizamos lista desplegable del lado del cliente y de algunas jQuery.

Tienes dos opciones:

  1. zanja el AJAX CascadingDropDown, sustituir con menús desplegables regulares, llamando al servicio web en el cliente, haga clic con jQuery/javascript.
  2. Desactiva la validación de eventos en la página. (no recomendado).

La validación de eventos evita que se manipule el estado de la página entre las solicitudes. Desafortunadamente, el CDDL de AJAX hace exactamente esto, por la razón que sea.

No es algo que deba desactivar solo para que funcione la CDDL, ya que afectará a toda la página y puede causar problemas de seguridad.

Mi consejo, muerda la bala: elimine la CDDL y reemplace con jQuery.

+0

Hola RPM, gracias por su respuesta. Verifique el enlace en mi publicación anterior, esto funciona muy bien y no tiene que desactivar la validación de eventos en la página. – b3n

0

He buscado mucho y terminé con esta solución: http://avinashsing.sunkur.com/2011/03/24/dropdownlist-in-asp-net-does-not-retain-control-state/

de usuario genérica, en su página de Padres:

Protected Sub cbGenericDropDownList_DataBound(sender As Object, e As System.EventArgs) If Not IsNothing(HttpContext.Current.Request(DirectCast(sender, DropDownList).UniqueID)) Then DirectCast(sender, DropDownList).SelectedValue = _ HttpContext.Current.Request(DirectCast(sender, DropDownList).UniqueID) End If End Sub

y luego, para cada control DropDownList en su página, agregue: OnDataBound = "cbGenericDropDownList_DataBound"

Cuestiones relacionadas