惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
宝玉的分享
宝玉的分享
腾讯CDC
博客园_首页
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
美团技术团队
P
Privacy International News Feed
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
D
DataBreaches.Net
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
S
Schneier on Security
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
Forbes - Security
Forbes - Security
D
Docker
T
Tenable Blog
S
Secure Thoughts
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

博客园 - karoc

《重构-改善既有代码的设计》读书笔记 扩展GridView,增加单选按钮列 任务开始时间和完成时间 又是关于AjaxControlToolkit的ModalPopup的问题 有个总结 使用svn的小插曲 开发小经验总结(不断更新) 今天发现一个VS2008中文版和英文版的差别 解决DocType引起AjaxTookit的ModulPopup显示异常问题的方法 Reporting Services 2005 常见问题解决方法(不断更新) 用VSTO开发Project插件心得 自定义MemberShipProvider和PersonalizationProvider使用WebParts实现个性化页面 在线修改KeyValue配置节 瞎搞八搞,另类PageBase 改造Duwamish中的Configuration 直接用Response输出可以加批注的Excel C#控制Windows Messenger和Windows Live Messenger窗口发送消息 一个读取扩展名为xml的资源文件的方法 用C#+WMI实现获取w3wp进程对应的应用程序池
最大长度验证控件:MaxLengthValidator
karoc · 2009-12-25 · via 博客园 - karoc

如果数据库字段为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);
        }
    }