2008-08-28 20 views
12

Estoy usando una versión anterior de ASP.NET AJAX debido a limitaciones de tiempo de ejecución, no funciona la colocación de un Validador de ASP.NET dentro de un panel de actualización. ¿Hay un truco para hacer estos trabajos, o necesito utilizar el control ValidatorCallOut que viene con el kit de herramientas AJAX?Validadores de ASP.NET dentro de un UpdatePanel

Respuesta

21

sospecho que está ejecutando la versión original (RTM) de .NET 2.0.

Hasta principios de los controles de validación de 2007 no eran compatibles con UpdatePanels. Esto se resolvió con el SP1 de .NET Framework.

El origen del problema es que UpdatePanel puede detectar cambios de marcado en su página, pero no tiene forma de seguir correctamente las secuencias de comandos. Los validadores dependen en gran medida de los scripts. Durante una devolución de datos parcial, los scripts se agotan, no se actualizan o no se ejecutan cuando se supone que deben hacerlo.

En early Betas, MS tenía el UpdatePanel intente adivinar qué scripts necesitaban volver a procesarse o ejecutarse. No funcionó muy bien, y tuvieron que sacarlo.

Para solucionar el problema inmediato, Microsoft lanzó una versión parcheada de las clases de validador en una nueva DLL llamada Validators.DLL, y dio instrucciones sobre cómo decirle a ASP.NET que use esas clases en lugar de las reales. Si busca el nombre de esa DLL, busque más información. Consulte también This blog post.

Esta fue una medida de emergencia gag y usted debe lo use evitar si es posible.

La solución real al problema apareció poco después, en .NET 2.0 SP1. Microsoft introdujo un nuevo mecanismo para registrar scripts en SP1, y cambió las clases de validador reales para usar ese mecanismo en lugar del antiguo.

te voy a dar algunos detalles sobre los cambios:

Tradicionalmente, que se supone para registrar las secuencias de comandos a través de métodos de página, como Page.RegisterStartupScript() y Page.RegisterClientScriptBlock(). El problema es que estos métodos no fueron diseñados para la extensibilidad y UpdatePanel no tenía manera de monitorear esas llamadas.

En SP1 hay un nuevo objeto de propiedad en la página llamada Page.ClientScripts. Este objeto tiene métodos para registrar scripts que son equivalentes (y de alguna manera mejores) a los originales. Además, UpdatePanel puede monitorear estas llamadas, para que reenvíe o llame a los métodos cuando corresponda. Los métodos anteriores de RegisterStartupScript(), etc. han quedado en desuso. Todavía funcionan, pero no dentro de un UpdatePanel.

No hay ninguna razón (aparte de la política, supongo) para no actualizar sus instalaciones a .NET 2.0 SP1. Los Service Packs tienen correcciones importantes.

Buena suerte.

+0

¡Gracias! Uno de mis servidores mostraba este comportamiento, y de hecho, faltaba sp1. – edosoft

2

@jmein

En realidad, el problema es que la secuencia de comandos de cliente Validador no funcionan cuando se colocan dentro de un UpdatePanel (UpdatePanels refrescar usando .innerHTML, que añade los nodos de script como nodos de texto, no a los nodos de secuencia de comandos, por lo el navegador no los ejecuta).

La solución fue un parche lanzado por Microsoft que soluciona este problema. Lo encontré con la ayuda de Google.

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx

3

@Jonathan Holland: ¿Qué hay de malo con el uso de Validators.dll?

Dado que reemplazan las clases originales, está pasando por alto silenciosamente cualquier error y corrección de seguridad, mejoras, etc. que Microsoft pueda lanzar en el futuro (o que ya haya sido liberado). A menos que mires detenidamente el archivo web.config, es posible que nunca notes que te estás salteando parches.

Por supuesto, debe evaluar cada situación. Si está absolutamente atascado con .NET 2.0 RTM, entonces Validators.dll es mejor que nada.

-1

Si por cualquier razón usted no puede utilizar la versión udpated de los controles de validación ASP.NET es realmente muy fácil de validar un grupo de validación a sí mismo, todo lo que tiene que hacer es llamar

Page_ClientValidate("validationGroupName"); 

Entonces puede usar PageRequestManager para ejecutar la validación según lo necesite.

Definitivamente utilizando los controles de validación actualizados es el camino a seguir, pero soy bastante parcial a JavaScript;)

Cuestiones relacionadas