Das ist mal wieder typisch. Tagelang suche ich nach einer Lösung für mein Problem, und kaum dass ich mein Problem in den ASP .NET Foren und in meinem Blog veröffentliche und um Rat frage komme ich selbst drauf :). Also hier ist die Lösung:
Problembeschreibung
Erzeugt man Validation-Controls per Code innerhalb eines ASP .NET UpdatePanel und verwendet "partial rendering" (d.h. bei einem Postback wird nur der Inhalt des UpdatePanel dynamisch über JavaScript nachgeladen, und nicht die komplette Seite), so erhält man nach einem Postback einen JavaScript-Fehler. Der Fehler tritt auf, weil nach dem Postback alle Expando-Attribute (das sind zusätzliche Attribute von Web Controls, wie z.B. "controltovalidate" bei den Validation Controls) nicht mehr definiert sind. Der Fehler tritt nicht auf, wenn die XHTML Compliance-Mode der Seite auf "legacy" eingestellt ist, in der Standardeinstellung wird allerdings XHTML-Code erzeugt, so dass der Fehler auch auftritt.
Ursache
In XHTML konformen Dokumenten sind zusätzliche Attribute wie "controltovalidate" nicht erlaubt. Damit diese trotzdem über JavaScript verfügbar sind, erzeugt ASP .NET in solchen fällen statt Attributen JavaScript-Code, der die Attribute setzt. Innerhalb eines UpdatePanels muss JavaScript-Code beim ASP .NET Ajax ScriptManager registriert werden, damit der Code nach einem Postback innerhalb des UpdatePanel erneut ausgeführt wird. Die Validation Controls kennen den ScriptManager natürlich nicht, sondern registrieren ihren Script-Code nur beim ClientScriptManager der Page-Klasse. Damit man diese Controls trotzdem innerhalb eins UpdatePanel verwenden kann gibt es Ajax-kompatible Versionen dieser Controls im Namespace System.Web.UI.Compatibility. Deklarativ (also in der ASPX-Seite) erzeugte Controls werden automatisch auf die Controls in diesem Namespace gemappt, d.h. statt der ASP .NET Version der Validation Controls wird automatisch und für den Entwickler transparent die ASP .NET Ajax Version erzeugt. Wenn man selbst Controls per Code erzeugt erfolgt dieses Mapping nicht, deshalb funktionieren die Validation Controls nicht.
Lösung
Statt der Controls aus System.Web.UI muss man einfach nur die Ajax-kompatiblen Versionen aus System.Web.UI.Compatibility verwenden.
Informationsquellen
http://ajax.asp.net/docs/mref/N_System_Web_UI_Compatibility.aspx