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

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

博客园 - 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);
        }
    }