c# – Semplice hack per risolvere un bug in function ValidatorOnChange(event)

Oggi sono incappato in questo fantastico bug nella parte di validazione delle pagine in asp.net, in pratica utilizzando un controllo calendario AJAX, nel momento della selezione di una data qualsiasi mi veniva segnalato un errore js a livello di utilizzo di un oggetto non valido, errore segnalato anche sul sito microsoft:
(https://connect.microsoft.com/Connect/feedback/ViewFeedback.aspx?FeedbackID=370182)

che si stanno trascinando dalla versione 1.0. Fin quando si utilizza il framework 1.0/1.1, l’errore è facilmente aggirabile correggendo direttamente la WebUIValidation.js presente all’interno della aspnet_client di IIS. Dalla versione 2.0 le cose si complicano leggermente, perchè lo script di validazione viene generato dinamicamente e reso disponibile tramite WebResource.axd, quindi a meno che non disassemblare la System.Web.Extensions.dll e correggerla, quello che vi propongo qui di seguito è un semplice workaround per risolvere l’errore in questione.

Sicuramente meglio di quello che propone un certificato microsoft:

se avete questo problema disabilitate completamente i validatori sulla vostra pagina…

soluzione interessante! oO

In breve si tratta di fare un vero e proprio overwrite della funzione incriminata, quindi il nostro WebResource.axd continuerà a creare lo script di validazione buggato e noi non faremo altro che registrare il nostro script con la nuova funzione corretta, sicuramente non elegante ma funzionale:

function ValidatorOnChange(event) {
if (!event) {
event = window.event;
}
Page_InvalidControlToBeFocused = null;
var targetedControl;
if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
targetedControl = event.srcElement;
}
else {
targetedControl = event.target;
}
var vals;
if (typeof(targetedControl.Validators) != "undefined") {
vals = targetedControl.Validators;
}
else {
if (targetedControl.tagName.toLowerCase() == "label") {
targetedControl = document.getElementById(targetedControl.htmlFor);
vals = targetedControl.Validators;
}
}
if (vals != null) { /* ecco la nostra correzione */
var i;
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
ValidatorUpdateIsValid();
}
}



Commenti

Post popolari in questo blog

Akiko The Hero