2008-10-31 8 views
5

Tengo una página con algunos botones añadidos dinámicamente. Si hace clic en un botón antes de que la página se ha cargado completamente, se produce la excepción clásica:¿Cómo evito las excepciones del envío de formularios de páginas medio cargadas al usar la validación de eventos asp.net?

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.

estoy adivinando el campo Viewstate no se ha cargado en la forma, sin embargo, están siendo sometidos los bits de los demás. ¿Cuál es la mejor manera de prevenir este error mientras se mantiene la Validación de eventos?

Respuesta

4

Respondí una pregunta similar here. Para citar:

Esencialmente, querrá que el ViewState se cargue en la parte superior de la página. En .NET 3.5 SP1, la propiedad RenderAllHiddenFieldsAtTopOfForm se agregó a la configuración de PagesSection.

Web.config

<configuration> 

    <system.web> 

     <pages renderAllHiddenFieldsAtTopOfForm="true"></pages> 

    </system.web> 

</configuration> 

Curiosamente, el valor por defecto de esto es cierto. Entonces, en esencia, si usa .NET 3.5 SP1, el ViewState se renderiza automáticamente en la parte superior del formulario (antes de que se cargue el resto de la página), eliminando así el error de ViewState que está recibiendo.

+0

por defecto a "verdadero", ver http://goo.gl/jHr8 en MSDN – craigmoliver

0

¿Qué sucede si establece la propiedad visible de esos botones en falso de forma predeterminada y al final de la carga de página o validación de eventos establece su propiedad visible en verdadero? De esta manera, les impide hacer clic en el botón hasta que la página se haya cargado por completo.

0

Por lo que puedo decir, el ViewState se carga justo después de la etiqueta del formulario en la página.

¿Ha intentado utilizar ClientScriptManager.RegisterForEventValidation(button.UniqueID) para cada botón después de agregar el botón a la página? Dependiendo de dónde agregue el botón, la conexión de evento para la página ya puede haber sucedido y, por lo tanto, los eventos generados por el botón pueden no registrarse en la página.

+0

apuesto a que tienen que ser declarada en Page_Init ... – Shawn

2

He encontrado que esto es causado más a menudo por el campo __EVENTVALIDATION que el ViewState no cargado. El __EVENTVALIDATION se encuentra en la parte inferior de la página y si el cliente no lo recibió cuando el usuario genera una devolución de datos obtendrá esa excepción.

Todavía no he encontrado una gran solución, pero lo que suelo hacer en páginas que tienden a causar esto debido a grandes cantidades de contenido es conectar los botones a una función javascript que comprueba una var isLoaded que solo obtiene configurado en verdadero en la llamada a document.ready. Si isLoaded es falso, come el evento silenciosamente, si es cierto lo deja pasar. Me duele configurar esto, pero ha terminado la mayoría de mis problemas de devolución de datos no válidos.

+0

tiene razón, es el campo de validación de eventos. esto está arreglado en 3.5 aparentemente. – Shawn

0

Pasé bastante tiempo tratando de averiguar por qué la etiqueta __EVENTVALIDATION aparece en la parte inferior de un sitio en particular, pero hacia la parte superior en cualquier otro sitio web. Eventualmente descubrí que era debido al código en el evento de anulación de Render.Eso, junto con un estado de vista magra en su mayoría se deshizo de este error, pero sólo por si acaso he añadido la lógica continuación en el botón que estaba causando el error:

Javascript lugar de la página

function CheckForHiddenFields() 
{ 
    var EventValidation = document.getElementById('__EVENTVALIDATION'); 
    if (EventValidation && EventValidation.value && EventValidation.value != '') 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Añadir atributo para asp: Button:

OnClientClick="return CheckForHiddenFields();" 
Cuestiones relacionadas