2010-01-11 6 views
11

Sé que este es un tema muy debatido, y generalmente cuando estás pensando en esto como una solución, es posible que quieras replantear tu lógica de UI.Desactiva EventValidation para control único, ¿es posible?

Sé que puedo pasar la validación utilizando ClientScriptManager.RegisterForEventValidation. Pero, realmente me gustaría saber. ¿Es posible eliminar la validación de eventos para un solo control? ¿Hay alguna forma de evitar esto?

Estoy modificando DropDownList, desde el lado del cliente después de que se represente.

Respuesta

3

La respuesta corta a tu pregunta es: No, no hay manera de hacer esto. Debe desactivar EventValidation para toda la página.

Existen varias soluciones ... Si realmente no desea deshabilitar EventValidation, almacene el valor seleccionado en un campo oculto y restaure el estado de DropDownList (¿o tal vez simplemente selección clara?).

Si necesita todos los valores agregados del lado del cliente, debe enviarlos usando algún otro método de todos modos, porque no estarán presentes en el control del lado del servidor. Esos valores no están publicados!

+0

Después de probar diferentes cosas, se me ocurrió la misma respuesta a mi pregunta. –

3

Encontré más fácil reemplazar el control con el equivalente HTML con runat = "server", luego puede recuperar el valor the old fashion way con Request.Forms ["id"]. No se realizará ninguna validación, por lo tanto, tenga cuidado al almacenar o procesar los datos.

La otra opción es anular el Render en la página y usar Page.ClientScript.RegisterForEventValidation con todas las respuestas posibles (no es agradable). algo como esto

protected override void Render(HtmlTextWriter writer) 
    { 
     this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "a"); 
     this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "b"); 
     this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "c"); 
     base.Render(writer); 
    } 
+0

Si lees la pregunta, conozco este método. Pero implica conocer los valores que se agregarán en el lado del cliente antes de que se represente el control, cosa que no hago. –

+1

+1 por sugerir el uso de un equivalente HTML genérico. ¡Buen pensamiento! –

+0

Al tratar de recuperar el valor de PostBack y está utilizando MasterPages, la ID no solo será "ID". Para obtener el valor, puede probar Request.Form [Request.Form.AllKeys.First (x => x.Contains ("id"))] – hacker

30

El atributo SupportsEventValidation no se hereda para las subclases, por lo que si crea una subclase de DropDownList, no aplique ese atributo a la subclase y use la subclase en su página, tendrá un control que no desencadenará validación de eventos, incluso si la validación de eventos está habilitada en la página.

public Class DynamicDropDownList : DropDownList 
{ 
} 

http://msdn.microsoft.com/en-us/library/system.web.ui.supportseventvalidationattribute%28v=VS.110%29.aspx

+0

No puedo creer que el hack sucio funcione, ¡gracias! –

+0

Absolute genius! – RemarkLima

+3

He estado en SO 4+ años. Esta es la mejor colisión de "respuesta terrible" y "respuesta maravillosa" que he visto. Esta respuesta necesita un botón de "donación". – lance

4

Otra manera de manejar esto:

Establecer la propiedad EnableViewState="False" en el elemento en particular.

Razonamiento: Si usa JavaScript para cambiar este valor fuera del control de ASP.NET, entonces ViewState se está poniendo en su camino en ese momento. Deja de usarlo para ese control.

Cuestiones relacionadas