打造自己的asp.net验证控件

   ASP.NET自带的验证控件具有使用方便,开发快捷等优点。开发人员不必使用js就可以方便地对页面各项控件进行输入验证。但是它也有些不足之处,如:界面单调, 只能通过红色字体显示(当然自定义验证控件除外);只能放在某一固定位置;需要占用一定的版面空间,如果错误消息比较长,会严重影响布局,即使将显示方式设为dynamic,当它显示错误消息时会撑大页面,影响美观,因此,我们有必要对它稍改进一下。

     我们研究一下ASP.NET的js代码(下载页面中WebResource.axd?d=SD1NUwMQGhYXe3jLq5kyhRg80avbG6v4rFgfT8pf7Lg1&t=633409665581718750指向的文件)发现用来显示错误消息的是ValidatorUpdateDisplay这个函数来完成的,关键的一句,是 val.style.visibility = val.isvalid ? "hidden" : "visible"; 如果我们想用alert方式显示的话,只需将这句改成alert(val.innerHTML)就可以了,但我们想做得更好看一点,做成类似于QQ聊天窗口的效果,效果可看下图:

 

 

 

 

 

 

要实现这个效果,需要以下几个图片。

  以下是源码:

<% @ Page Language="C#" AutoEventWireup="true" CodeBehind="myvalid.aspx.cs" Inherits="Test.myvalid"  %>
 
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > 无标题页 </ title >

< style >

.MsgC
{
    border-top
:solid 1px #C6C3C6;
    height
:6px;
    background-color
:#FFFBEF;
    font-size
:1px;
}

.MsgL
{
    
  
    BACKGROUND
: url(images/vMsgL.gif)  no-repeat left top;
    width
:7px;
    height
:6px;
    
}

.MsgR
{
 
    BACKGROUND
: url(images/vMsgR.gif)  no-repeat  ;
   
    width
:24px;
    height
:6px;
}

.MsgBL
{
    
  
     
    BACKGROUND
: url(images/vMsgBL.gif)  no-repeat left top;
     width
:7px;
    height
:6px;
  
  
  
    
}

.MsgBC
{
     
     
    BACKGROUND
: url(images/vMsgBC.gif)  repeat-x;
    height
:19px;
    
}

.MsgBR
{
    
 
     
    BACKGROUND
: url(images/vMsgBR.gif)  no-repeat left top;
    width
:24px;
    height
:19px;
    
}


</ style >
</ head >
< body  style ="font-size:12px" >
    
< form  id ="form1"  runat ="server" >
       
< div  style ="font-weight:bold;height:60px" >  打造自己的验证控件: </ div >
       
        姓名:
< asp:TextBox  ID ="TextBox1"  runat ="server" ></ asp:TextBox >
        
< asp:RequiredFieldValidator  ID ="RequiredFieldValidator1"  runat ="server"  Display ="dynamic"  ControlToValidate ="TextBox1"
            ErrorMessage
="请输入姓名!"  SetFocusOnError ="True" ></ asp:RequiredFieldValidator >< br  />
        证件号:
< asp:TextBox  ID ="TextBox2"  runat ="server" ></ asp:TextBox >
        
< asp:RequiredFieldValidator  ID ="RequiredFieldValidator2"  runat ="server"  Display ="dynamic"  ControlToValidate ="TextBox2"
            ErrorMessage
="请输入证件号!"  SetFocusOnError ="True" ></ asp:RequiredFieldValidator >
        
< asp:RegularExpressionValidator  ID ="RegularExpressionValidator1"  runat ="server"   Display ="dynamic"  ControlToValidate ="TextBox2"
            ErrorMessage
="证件号格式不符!"  ValidationExpression ="d{17}[d|X]|d{15}" ></ asp:RegularExpressionValidator >< br  />
        
< asp:Button  ID ="Button1"  runat ="server"  Text ="确定"   />
        
    
    
</ form >
</ body >
</ html >

< script  type ="text/javascript" >

 
function ValidatorUpdateDisplay(val) {
    
if (typeof(val.display) == "string"{
        
if (val.display == "None"{
            
return;
        }

        
if (val.display == "Dynamic"{
            
//val.style.display = val.isvalid ? "none" : "inline";
           // return;
        }

    }

    
if ((navigator.userAgent.indexOf("Mac"> -1&&
        (navigator.userAgent.indexOf(
"MSIE"> -1)) {
        val.style.display 
= "inline";
    }

    ShowZfValidMsg(val);
   
// val.style.visibility = val.isvalid ? "hidden" : "visible";
}


function Page_ClientValidate(validationGroup) {
    Page_InvalidControlToBeFocused 
= null;
    
if (typeof(Page_Validators) == "undefined"{
        
return true;
    }

    
var i;
    
for (i = 0; i < Page_Validators.length; i++{
        
        ValidatorValidate(Page_Validators[i], validationGroup, 
null);
        
//Added By zhaofeng
        if(!Page_Validators[i].isvalid)// only show one  errmsg
        {
            Page_IsValid 
= false;
            Page_BlockSubmit 
= !Page_IsValid;
            
return false;
        }

        
//Added End
    }

    
    ValidatorUpdateIsValid();
 
    ValidationSummaryOnSubmit(validationGroup);
    Page_BlockSubmit 
= !Page_IsValid;
    
return Page_IsValid;
}


function ShowZfValidMsg(val)
{   
    
//window.status = val.isvalid;
    var tbId  = "tbValidMsg";//+val.controltovalidate;
    var tb = document.getElementById(tbId);
    
if(val.isvalid && tb == nullreturn;
    
    
if(tb == null)
    
{
        tb 
= document.createElement("table");
        tb.border
= 0 ;
        tb.id 
= tbId;
        tb.cellSpacing 
= 0 ;
        tb.cellPadding 
= 0 ;
        
var tr = tb.insertRow(0);
        
var cell = tr.insertCell(0);
        cell.className 
= "MsgL";
        
        cell 
=  tr.insertCell(1);
        cell.className  
= "MsgC";
        cell.innerHTML 
= "&nbsp;";
       
        cell 
=  tr.insertCell(2);
        
        cell.className  
= "MsgR";
        
//the second row
        tr = tb.insertRow(1);
        cell 
= tr.insertCell(0);
        cell.bgColor 
= "#FFFBEF";
        cell.style.cssText
=  "border-left:solid 1px #C6C3C6";
        cell.innerHTML 
= "&nbsp;"
        cell 
= tr.insertCell(1);
        cell.bgColor 
= "#FFFBEF";
        cell.height  
= 40;
        cell.innerHTML 
= "<div style='float:left;padding-top:1px'><img src='images/yellowalert.gif' /></div>"+
        
"<span style='color:black;font-size:12px;height:40px;width:100px;padding-top:10px;padding-bottom:10px;padding-right:0px;padding-left:3px'></span>";
        
        cell 
= tr.insertCell(2);
        cell.bgColor 
= "#FFFBEF";
        cell.style.cssText
=  "border-right:solid 1px #C6C3C6";
        cell.innerHTML 
= "&nbsp;"
        
//the third row
        tr = tb.insertRow(2);
        cell 
= tr.insertCell(0);
        cell.className 
= "MsgBL";
        cell 
=  tr.insertCell(1);
        cell.innerHTML 
= "&nbsp;";
        cell.className  
= "MsgBC";
        cell 
=  tr.insertCell(2);
        
        cell.className  
= "MsgBR";
        document.body.appendChild(tb);
        tb.style.cssText
= "position:absolute;zIndex:500";
    }

    tb.rows[
1].cells[1].childNodes[1].innerHTML = val.innerHTML;
    tb.style.display 
= val.isvalid?"none":"";
    
var obj = document.getElementById(val.controltovalidate);
    
if(obj !=null)
    
{
        
var ary = GetElePos(obj);
        
var l = ary[0]+obj.offsetWidth-tb.offsetWidth;
        
if(l<0) l= 0 ;
        
var t = ary[1]-tb.offsetHeight+15;
        
if(t<0) t = 0 ;
        tb.style.left 
= l 
        tb.style.top 
= t;
    }

    
return ;
    
}

  
function GetElePos(e)
    
{
        
var t=e.offsetTop; 
         
var l=e.offsetLeft; 
         
while(e=e.offsetParent)
         t
+=e.offsetTop; 
         l
+=e.offsetLeft; 
         }
 
         
return [l, t];
    }

</ script >

 

如果想在整个系统中应用这个效果的话,只需将页面尾部的javascript脚本封装到一个js文件中,放在需要应用的页面的尾部,无需再添加任何代码。

 

 

 

 

发表于 @ 2008年04月01日 10:40:00|评论(12 <script type="text/javascript">AddFeedbackCountStack("2235114")</script> )|编辑

旧一篇: web自定义控件示例,一个自动分页的datagrid例子

<script type="text/javascript">document.write(" ");</script> <script type="text/javascript">LoadFeedbackCount();</script> <script language="javascript" type="text/javascript"> ad_width=468; ad_height=60; adcss=2; unionuser=19; tags=''; ad_type='j'; count=2; </script> <script language="javascript" src="http://tagegg.csdn.net/showads.js" type="text/javascript"></script> <script language="JavaScript1.1" src="http://tagegg.csdn.net/a.aspx?action=displayad&unionuser=19&unionurl=http%3A%2F%2Fblog.csdn.net%2Fcpp2017%2Farchive%2F2008%2F04%2F01%2F2235114.aspx&adcss=2&ad_type=j&width=468&height=60&ad_color=&ad_color_border=&count=2" type="text/javascript"></script>
揭秘3D游戏实时毛发渲染
游戏设计、逼真,生动 手把手教你实时渲染,生动示例
软件业大小S姐妹貌合神离
提起演艺圈的大S、小S,可以说是如日中天 在软件行业,也有这样一对概念——SOA与SaaS
<script language="javascript" src="http://blog.csdn.net/js/show_blog_tagad.js" type="text/javascript"></script> media="all" href="http://blog.csdn.net/css/tag_blog.css" type="text/css" rel="stylesheet" />

评论

# andyleec 发表于2008-04-01 17:21:21  IP: 124.236.212.*
太强了,真是万分感谢啊,非常炫
# haolaiwu 发表于2008-04-01 23:19:53  IP: 125.109.249.*
效果不错,多谢
另外,提示的时候,下面的文本框被上面的提示框挡住了,重新输入的时候不方便,不知道怎么改进好
# cpp2017 发表于2008-04-01 23:24:19  IP: 58.61.73.*
如果档住了,改一下这段代码就可

var l = ary[0]+obj.offsetWidth-tb.offsetWidth;
if(l<0) l= 0 ;
var t = ary[1]-tb.offsetHeight+15;
if(t<0) t = 0 ;
tb.style.left = l
tb.style.top = t;
比如将t 改小一些就可以
# only_endure 发表于2008-04-02 08:34:29  IP: 222.45.90.*
收藏了,正学习自定义控件。
# haidy_lau 发表于2008-04-02 18:02:24  IP: 218.241.139.*
试了一下,效果已经能够实现
不过,想问一下,当我再次单击每二个文本框再次填写身份证号的时候,能不能让这个提示消失(或者点击空白处时让提示消失)?
javascript不太熟,谢谢先!!
# cpp2017 发表于2008-04-02 18:17:19  IP: 121.35.72.*
回haidy_lau
如果数据验证通过,会消失的.就如同系统默认的控件一下.
# selfhigh 发表于2008-04-02 18:58:41  IP: 124.78.221.*
不知道其它的语言,比如PHP可不可以调用啊?谢谢!
# cpp2017 发表于2008-04-02 19:30:20  IP: 121.35.72.*
其他语言不能直接调用,需要改造。
# haidy_lau 发表于2008-04-03 09:46:07  IP: 218.241.139.*
对于下面这段代码不是很明白
function Page_ClientValidate(validationGroup) ...{
Page_InvalidControlToBeFocused = null;
if (typeof(Page_Validators) == "undefined") ...{
return true;
}
var i;
for (i = 0; i < Page_Validators.length; i++) ...{

ValidatorValidate(Page_Validators[i], validationGroup, null);
//Added By zhaofeng
if(!Page_Validators[i].isvalid)// only show one errmsg
...{
Page_IsValid = false;
Page_BlockSubmit = !Page_IsValid;
return false;
}
//Added End
}

ValidatorUpdateIsValid();

ValidationSummaryOnSubmit(validationGroup);
Page_BlockSubmit = !Page_IsValid;
return Page_IsValid;
}

我感觉这个应该是改造默认验证控件的代码,不过,这段代码在具体含义和作用有点不太懂,您可否简单提示一下呢?谢谢~~~
# cpp2017 发表于2008-04-03 10:37:21  IP: 218.18.61.*
这段代码的主要功能是循环页面中的所有验证控件,一个一个去验证,如果不通过,则返回false,此时页面不能提交.
它原来的代码是验证完所有的控件,我改成了碰到一个不通过就返回,因为不想显示太多的提示信息.
# xp1056 发表于2008-04-07 10:30:53  IP: 218.58.71.*
这个是不是要求.net版本2005以上?我在03里面用的,没体现出效果来。
比如:SetFocusOnError="True"提示验证控件的该属性找不到
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值