随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

自己写了一个验证控件,继承自BaseValidator.这个控件的目的就是当用户在文本框输入的字符串的长度短于设定的长度时,就提示错误。实现步骤如下:


1. 定义js路径
        private string _clientFileUrl = "ClientFiles/";


        
// 定义属性ClientFileUrl,用于获取或设置脚本相对路径 
        [
         Description(
"获取或设置脚本相对路径"),
         DefaultValue(
"ClientFiles/"),
         Category(
"Appearance")
        ]
        
public string ClientFileUrl
        {
            
get
            { 
return _clientFileUrl; }
            
set
            { _clientFileUrl 
= value; }
        }

2. 定义最小长度

        private int _intLestLength = 0;

        
#region LestLength // 输入内容的最短长度
        
/// <summary>
        
/// 输入内容的最短长度
        
/// </summary>
        [Bindable(true)]
        [Category(
"Custom")]
        [DefaultValue(
0)]
        [Localizable(
true)]
        
public int LestLength
        {
            
get
            {
                
return _intLestLength;
            }
            
set
            {
                _intLestLength 
= value;
            }
        }
        
#endregion


3. 重写AddAttributesToRender,为验证控件添加特殊属性evaluationfunction和validationexp 


        //重写AddAttributesToRender,为验证控件添加特殊属性evaluationfunction和validationexp 
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            
base.AddAttributesToRender(writer);
            
if (RenderUplevel)
            {
                writer.AddAttribute(
"evaluationfunction""TextBoxLestLengthValidatorEvaluateIsValid"false);
                writer.AddAttribute(
"LestLength"this.LestLength.ToString() );
            }
        }


4 .重写OnPreRender方法,注册客户端脚本程序 


        
//重写OnPreRender方法,注册客户端脚本程序 
        protected override void OnPreRender(EventArgs e)
        {
            
base.OnPreRender(e);
            
if (RenderUplevel)
            {
                Page.ClientScript.RegisterClientScriptBlock(
typeof(TextBoxLestLengthValidator),
                 
"ClientValidator", GetClientFileUrl("ClientValidator.js"));
            }
        } 

5. 继承ControlPropertiesValid方法。

        protected override bool ControlPropertiesValid()
        {
            
// Should have a text box control to check
            Control ctrl = FindControl(ControlToValidate);

            
if (null != ctrl)
            {
                
if (ctrl is System.Web.UI.WebControls.TextBox)    // ensure its a text box
                {
                    
return true;
                }
                
else
                    
return false;
            }
            
else
                
return false;
        }

6. 继承EvaluateIsValid方法,确定被验证的控件是TextBox

        protected override bool EvaluateIsValid()
        {
            Control ctrl 
= FindControl(ControlToValidate);
            TextBox tb 
= ctrl as TextBox;

            
if (tb.Text.Trim().Length >= _intLestLength)
            {
                
return true;
            }
            
else
            {
                
return false;
            }

        }

7.实现辅助函数GetClientFileUrl,用于获取JavaScript文件的完整路径 

      // 实现辅助函数GetClientFileUrl,用于获取JavaScript文件的完整路径 

      
private string GetClientFileUrl(string fileName) 
      { 
        
string tempClient = String.Format("<script language=\"javascript\" src=\"{0}\"></script>", ClientFileUrl + fileName ); 
        
return tempClient; 
      } 

8. 在ClientFiles/ClientValidator.js文件中写下如下的代码:
 (该代码没有实现业务逻辑,暂时只返回ture或false.)

function TextBoxLestLengthValidatorEvaluateIsValid(val) {
     
return true;
   
}

-------------------------------------------------------------------
以上8步完成后,生成的自定义控件没有错误,也能在Text文本长度小于指定长度时给出提示,
但是问题在于:
给出的提示是在页面回传以后,这样服务器端的代码依然执行了,同时客户端也显示出错误信息:
我把第8步的return ture改成return false还是回传,问题到底出在哪里那?

 
[解决方法]
原来是我看错目录了,只要是javascript函数TextBoxLestLengthValidatorEvaluateIsValid返回的是false,页面会不会回传

另外,我还将上面的代码改变了一下,用webresource将js嵌入到dll中,这样使用时就不用再引用的项目中建立js文件了。嵌入的过程参考了下面的文章:
http://www.cnblogs.com/jackielin/archive/2005/11/29/286570.html

posted on   今夜太冷  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示