小菜一碟:何时把CustomValidator的ControlToValidate留空
csdn终于恢复了,高兴ing,特来上碟小菜:)
假设有两个Server Control,CheckBox chbIsAsian和DropDownList ddlCountry,ddlCountry里可以选自己的国家也可以空着,但如果chbIsAsian选中了,那么ddlCountry就必须选择,而且只能选亚洲的国家。如何实现呢?
想想是很简单的啦,放一个CustomValidator,ControlToValidate是ddlCountry,ClientValidationFunction是fcnMyFunction,然后再加一段Javascript,实现fcnMyFunction函数,在里面判断就是了。
但是:如果ddlCountry是空,而chbIsAsian选中的话,不会进行判断!
原因是,如果是CustomValidator,而ControlToValidate的值是空,那么,ClientValidationFunction是不会被调用的。
在http://localhost/aspnet_client/system_web/1_1_4322/WebUIValidation.js中有这么一段:
function CustomValidatorEvaluateIsValid(val) {
var value = "";
if (typeof(val.controltovalidate) == "string") {
value = ValidatorGetValue(val.controltovalidate);
if (ValidatorTrim(value).length == 0)
return true; // athos: 就是这里,直接pass了。
}
var args = { Value:value, IsValid:true };
if (typeof(val.clientvalidationfunction) == "string") {
eval(val.clientvalidationfunction + "(val, args) ;");
}
return args.IsValid;
}
Microsoft的逻辑是:
如果控件值不允许为空,那么请用RequiredFieldValidator;
如果允许为空,那么做Customised Validation的时候,俺就不验证控件值为空的情况了。
嗨,真是……怎么说呢,预设了很多啊。
解决办法呢?似乎可以……把CustomValidator的ControlToValidate放到chbIsAsian上,如果选中了,再校验具体国家。
但是还不完全对:CustomValidator的ControlToValidate不能设置为CheckBox。
而且,这种“解决方法”似乎还是有问题的,比如,两个DropDownList,不能同时为空,怎么验证呢?
正确的做法是:不设置CustomValidator的ControlToValidate。这样,在上面的代码中,val.controltovalidate是undefined,那个if(typeof(val.controltovalidate) == "string") {...} 就给绕过了,自定义的函数就一定可以执行。
这既适用于CheckBox的验证,也适用于验证Control的值是空也要求验证的情况。