最大长度验证控件:MaxLengthValidator

如果数据库字段为varchar或char类型,ASP.NET控件在可输入汉字的情况下,MaxLength属性不能保证在保存到数据库时不发生截断错误,因此写了一个最大长度验证控件,还可用于多行文本框。
代码
/// <summary>
    
/// TextBox的最大长度验证器,如果是varchar,char字段类型,需要此验证
    
/// </summary>
    [Description("对MaxLength进行验证")]
    [ToolboxData(
"<{0}:MaxLengthValidator runat=server></{0}:MaxLengthValidator>")]
    
public class MaxLengthValidator : BaseValidator
    {
        
/// <summary>
        
/// 获取或设置是否为非nvarchar,nchar字段验证
        
/// </summary>
        [DefaultValue(true)]
        
public bool ValidateForNonNationalField
        {
            
get
            {
                var data 
= this.ViewState["ValidateForNonNationalField"];
                
if (data == null)
                {
                    
return true;
                }
                
else
                {
                    
return (bool)data;
                }
            }
            
set
            {
                
this.ViewState["ValidateForNonNationalField"= value;
            }
        }

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        public MaxLengthValidator()
        {
            
this.ValidateForNonNationalField = true;
        }

        
protected override bool EvaluateIsValid()
        {
            var targetControlName 
= this.ControlToValidate;
            
if (targetControlName == null)
            {
                
//没有目标验证控件,验证通过
                return true;
            }

            var targetControl 
= this.NamingContainer.FindControl(targetControlName) as TextBox;
            
if (targetControl == null)
            {
                
//目标控件不是文本框或不存在,验证通过
                return true;
            }

            var maxLength 
= targetControl.MaxLength;
            var targetValue 
= this.GetControlValidationValue(targetControlName);
            var targetLength 
= 0;
            
if (string.IsNullOrEmpty(targetValue))
            {
                targetLength 
= 0;
            }
            
else
            {
                
if (this.ValidateForNonNationalField)
                {
                    targetLength 
= this.GetLengthForNonNationnal(targetValue);
                }
                
else
                {
                    targetLength 
= targetValue.Length;
                }
            }

            
return targetLength <= maxLength;
        }

        
/// <summary>
        
/// 获得保存为Varchar时,text的长度
        
/// </summary>
        
/// <param name="text"></param>
        
/// <returns></returns>
        public virtual int GetLengthForNonNationnal(string text)
        {
            
if (string.IsNullOrEmpty(text))
            {
                
return 0;
            }

            var length 
= 0;
            
for (var i = 0; i < text.ToCharArray().Length; i++)
            {
                var charCode 
= (int)text[i];
                
                length
++;
                
if (charCode > 255)
                {
                    length
++;
                }
            }
            
return length;
        }

        
protected override void AddAttributesToRender(HtmlTextWriter writer)
        {            
            
base.AddAttributesToRender(writer);

            
if (this.RenderUplevel)
            {
                writer.AddAttribute(
"TargetControlID",
                    
this.GetControlRenderID(this.ControlToValidate));
                writer.AddAttribute(
"ValidateForNonNationalField",
                    
this.ValidateForNonNationalField ? "true" : "false");
                writer.AddAttribute(
"evaluationfunction",
                             
"MaxLengthValidator_Validate");

                var targetControl 
= this.NamingContainer.FindControl(this.ControlToValidate) as TextBox;
                
if (targetControl != null)
                {
                    var maxLength 
= targetControl.MaxLength;
                    writer.AddAttribute(
"maxlength",
                        maxLength.ToString());
                }
            }
        }

        
protected override void OnPreRender(EventArgs e)
        {
            var script 
= @"
function MaxLengthValidator_GetNonNationalLength(text) {
    if (!text){
        return 0;
    }
    var length = 0;
    for (var i = 0; i < text.length; i++) {
        var charCode = text.charCodeAt(i);
        length++;
        if (charCode > 255) {
            length++;
        }
    }
    return length;
}
function MaxLengthValidator_Validate(val) {
    if (!val) {
        return true;
    }    
    var targetID = val.TargetControlID;
    if (!targetID) {
        return true;
    }
    var nonNational = val.ValidateForNonNationalField;
    if (!nonNational) {
        return true;
    } 
    var target = document.getElementById(targetID);
    if (!target) {
        return true;
    }
    var maxLength = val.maxlength;
    if (!maxLength || isNaN(maxLength)) {
        return true;
    }
    var targetValue = target.value;
    if (!targetValue) {
        return true;
    }
    var realLength = targetValue.length;
    if (nonNational == 'true')
    {
        realLength = MaxLengthValidator_GetNonNationalLength(targetValue);
    }
    return realLength <= parseInt(maxLength);
}
";
            ScriptManager.RegisterClientScriptBlock(
this,
                
typeof(MaxLengthValidator),
                
"MaxLengthValidator_Validate",
                script,
                
true);
            
            
base.OnPreRender(e);
        }
    }

 

posted @ 2009-12-25 12:32  karoc  阅读(903)  评论(0编辑  收藏  举报