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

代码如下:

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

(0)

相关推荐

  • js控制.net验证控件是否可用。

    function validChange() { // Do nothing if client validation is not active if (typeof (Page_Validators) == "undefined") return; if($("rbBotton_0").checked==false) { ValidatorEnable($('<%=RequiredFieldValidator5.ClientID%>'), false

  • 使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由

    主要理由有以下几点: 1.拖控件太麻烦,这个是微软控件的常用方式,你要使用一个控件你得从工具栏中拖到页面里(当然你也可以不拖手写). 2.必须指定验证对象,验证控件与其他textbox,dropdownlist控件不同的是它是验证其他控件的输入是否有效的,所以必须指定所验证的对象. 3.影响整个页面美观,像一些管理系统总是需要进行大量的用户输入验证,所以就可能导致一个页面上有几十个验证控件严重影响了原来页面里的东西,看起来十分不舒服. 4.ajax验证不方便,现在的系统越来越注重客户的用户体验,

  • ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList

    界面代码: 复制代码 代码如下: <form id="form1" runat="server"> <div align="center"> <fieldset style="width: 350px; height: 200px;"> <table border="0" cellpadding="3" cellspacing="3&q

  • fileupload控件 文件类型客户端验证实现代码

    无标题页 function CheckFileType() { var objButton=document.getElementById("Button1");//上传按钮 var objFileUpload=document.getElementById('FileUpload1');//FileUpload var objMSG=document.getElementById('msg');//显示提示信息用的DIV var FileName=new String(objFile

  • ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList

    首先看下界面代码: 复制代码 代码如下: <form id="form1" runat="server"> <div align="center"> <fieldset style="width: 350px; height: 200px;"> <table border="0" cellpadding="3" cellspacing="

  • 验证控件与Button的OnClientClick事件详细解析

    一.事件 这是一个长期被我忽略或者是没有发现的问题,问题是这样的: 在一个页面中,当有验证控件的时候,当Button控件触发OnClientClick事件,并且这个事件会返回true和false的时候,验证控件就会失效,不起作用了.具体描述如下: .Net页面如下: 复制代码 代码如下: <form id="form1" runat="server"><asp:ScriptManager ID="ScriptManager1"

  • 基于jquery实现的服务器验证控件的启用和禁用代码

    应用背景 1.用户需要填写表单时.2.页面采用服务器验证控件.3.由用户来选择是否填写更多项,更多项的显示与隐藏用Display控制,如下图. 点击"增加服务内容",显示新增表单项,如下图. 点击"取消增加",隐藏新增表单项. 问题:用户点击下一步时,不对Display=none的新增区域表单进行验证,需要在用户点击"取消增加时",禁用服务器验证控件.反之,启用服务器验证控件. 解决方法 还是使用JQuery来搞定吧,主要是太好用了. 1.输出要

  • jQuery Validate 验证,校验规则写在控件中的具体实例

    将校验规则写到控件中 复制代码 代码如下: <script src="../js/jquery.js" type="text/javascript"></script><script src="../js/jquery.validate.js" type="text/javascript"></script><script src="./js/jquery.met

  • jQuery密码强度验证控件使用详解

    本文实例为大家分享了jQuery密码强度验证控件,供大家参考,具体内容如下 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript" src="jquery-1.12.1.js"></script>

  • 教你用AngularJS框架一行JS代码实现控件验证效果

    如上图所示,我们需要实现如下这些验证功能: 控件都是必输控件 都需要控制最大长度 第一次打开页面,控件不能显示为错误状态 输入内容再清空后,必输控件需要显示为错误状态 只有所有输入合法后,发布按钮才能变为可用状态 通过AngularJS,我们可以很轻松的实现这些要求,只需要1行JS代码.UI样式这里采用的是Bootstrap.先上示例代码: HTML. <!DOCTYPE html> <html lang="zh-cn" ng-app="ftitApp&qu

随机推荐