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

推荐订阅源

G
GRAHAM CLULEY
T
Tenable Blog
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
S
Security Affairs
NISL@THU
NISL@THU
O
OpenAI News
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Schneier on Security
Schneier on Security
S
SegmentFault 最新的问题
S
Schneier on Security
G
Google Developers Blog
V
V2EX
C
Check Point Blog
U
Unit 42
Google DeepMind News
Google DeepMind News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
S
Secure Thoughts
博客园 - 司徒正美
Recorded Future
Recorded Future
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
K
Kaspersky official blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
博客园 - 聂微东
N
News and Events Feed by Topic
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Project Zero
Project Zero
W
WeLiveSecurity
博客园 - Franky

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