asp.net MaxLengthValidator 最大长度验证控件代码

时间:2021-11-18 17:18:28

代码如下:


/// <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); 

}