我們將 ASP.NET WebForm 專案中的 jQuery 從 1.8.3 更新到 1.11.1 後,
執行系統時,第一次進去頁面時,Validator沒有效,Postback後卻變成雙倍的驗證?
環境: ASP.NET WebForm .NET 2.0, Client 為 IE 11 使用相容性檢視到 IE7
當我們更新 jQuery 到 1.11.1 後,一進去系統,就會有 JS 的 Error,如下,
似乎找不到 jQuery 相關的解法,只好從 ASP.NET 的驗證機制著手了。
當我們程式呼叫 ASP.NET 的驗證 Page_ClientValidate function 時,卻沒有作用!!!
查到 ValidatorValidate 這個 function 才發現是因為,
驗證物件的 evaluationfunction 屬性值是字串,而不是 function ,所以就不起作用。那怎麼辦呢?
那就覆寫 ValidatorValidate 這個 function ,當 evaluationfunction 是字串時,將它轉成 function ,如下,
function ValidatorValidate(val, validationGroup, event) {
val.isvalid = true;
if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {
// 當 evaluationfunction 是字串時,將它轉成 function
if (typeof(val.evaluationfunction) == "string") {
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
}
//
if (typeof(val.evaluationfunction) == "function") {
val.isvalid = val.evaluationfunction(val);
if (!val.isvalid && Page_InvalidControlToBeFocused == null &&
typeof(val.focusOnError) == "string" && val.focusOnError == "t") {
ValidatorSetFocus(val, event);
}
}
}
ValidatorUpdateDisplay(val);
}
再來就是奇怪的 postback 後,所有的 Validator 都變成雙倍的狀況。
目前的解法就是覆寫 Page_ClientValidate 除去重覆的 Page_Validators 及 Page_ValidationSummaries ,如下,
function Page_ClientValidate(validationGroup) {
Page_InvalidControlToBeFocused = null;
if (typeof(Page_Validators) == "undefined") {
return true;
}
var i;
// 除去重覆的 Page_Validators 及 Page_ValidationSummaries
var distinct_Page_Validators = [];
for (i = 0; i < Page_Validators.length; i++) {
var isExists = false;
for (j = 0; j < distinct_Page_Validators.length; j++) {
if(Page_Validators[i].id == distinct_Page_Validators[j].id){
isExists = true;
break;
}
}
if(!isExists){
distinct_Page_Validators.push(Page_Validators[i]);
}
}
Page_Validators = distinct_Page_Validators;
//只要一個就夠了
if(Page_ValidationSummaries.length > 1){
Page_ValidationSummaries.length = 1;
}
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i], validationGroup, null);
}
ValidatorUpdateIsValid();
ValidationSummaryOnSubmit(validationGroup);
Page_BlockSubmit = !Page_IsValid;
return Page_IsValid;
}
以上的方式只是暫時的解法。
如果在 IE 相容性設定中,有找到 jQuery 的 Error 解法再跟大家 Update。
大家如果有更好的作法也請讓我知道,謝謝。
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^