[ASP.NET]WebForm 第一次進去頁面時,Validator沒有效,Postback後卻給我 Double 的驗證?

我們將 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:從零開始的軟體開發生活

請大家繼續支持 ^_^