/// <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); } }
Weitere Artikel zum Steuercode für die maximale Längenvalidierung von asp.net MaxLengthValidator finden Sie auf der chinesischen PHP-Website!