01 Dec 2006

在写自定义控件时,如果控件某个属性允许被验证控件验证,需要注意微软在 WebUIValidation.js内的实现。

Share

微软在WebUIValidation.js(System.Web的资源文件内自己找工具看吧)
内有如下代码:

function ValidatorGetValue(id) {
    
var control;
    control 
= document.getElementById(id);
    
if (typeof(control.value) == "string") {
        
return control.value;
    }
    
return ValidatorGetValueRecursive(control);
}
function ValidatorGetValueRecursive(control)
{
    
if (typeof(control.value) == "string" && (control.type != "radio" || control.checked == true)) {
        
return control.value;
    }
    
var i, val;
    
for (i = 0; i<control.childNodes.length; i++) {
        val 
= ValidatorGetValueRecursive(control.childNodes[i]);
        
if (val != ""return val;
    }
    
return "";
}


当自定义控件为符合控件,比如两个或多个DropDownList组合而成
而有一个Value属性来返回这几个DropDownList的返回选项,并且设置了ValidationPropertyAttribute去验证某个属性,如:
[ValidationPropertyAttribute( "Value" )]
当使用验证控件验证的时候,由于上面脚本在控件没有客户端value的时候返回的为第一个value不为空的ChildNode的value
值,这样用来验证,可能不是我们所需要的。
比如我需要非空验证控件来验证我的自定义控件所有的DropDownList都必须被选择时候,如果第一个有了选择,则该脚本认为验证通过了,叶面可以PostBack然而,在服务器端Page.IsValidata属性是false的。
我用了一个非常ugly的方法,在控件外层放一个父容器(可以通过override TagKey 来指定)span
在每个DropDownList的客户端onchange的时候 判断 如果 任一个没有选择,那么置span的value = ‘’;
当全部选择的时候再将span.value = 实际的值 ,这样就不会出现客户端验证通过,然而服务器端验证没有通过才出来ErrorMessage的情况了。

但是总觉得 这样非常的ugly,如果有其他朋友也遇到过这样的问题,欢迎讨论。

comments powered by Disqus