小菜一碟:何时把CustomValidator的ControlToValidate留空

athossmth 2004-06-06 10:36:36
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的值是空也要求验证的情况。
...全文
161 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dayasky 2004-06-07
  • 打赏
  • 举报
回复
好文章
进来接点分
athossmth 2004-06-06
  • 打赏
  • 举报
回复
哎呀,说得不清楚,

“……如果是CustomValidator,而ControlToValidate的值是空,那么,ClientValidationFunction是不会被调用的。”

这一句清楚的表达应该是:

“……如果使用CustomValidator,它的属性ControlToValidate中指定了验证的目标控件,并且目标控件的值是空,那么,ClientValidationFunction中指定的Javascript函数是不会被调用的。”

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧