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

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

 

版权

作者:灵动生活 郝宪玮

出处:http://www.cnblogs.com/ywqu

如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章,

img_2c313bac282354945ea179a807d7e70d.jpg

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

相关文章
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2439 0
|
9月前
|
开发框架 JSON 算法
ASP.NET Core Web API之Token验证
ASP.NET Core Web API之Token验证
141 0
|
存储 开发框架 前端开发
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
本文介绍 ASP.NET 中内置的验证功能,并介绍如何自定义验证返回信息,最后以统一社会信用代码为例,实现自定义的数据验证。
178 0
ASP.NET 中验证的自定义返回和统一社会信用代码的内置验证实现
|
开发框架 JSON 前端开发
ASP.NET MVC5----常见的数据注解和验证
ASP.NET MVC5----常见的数据注解和验证
299 0
ASP.NET MVC5----常见的数据注解和验证
|
开发框架 .NET
asp.net生成验证码并提交验证
asp.net生成验证码并提交验证
161 0
|
XML 开发框架 JSON
ASP.NET Core - 实现自定义WebApi模型验证
ASP.NET Core - 实现自定义WebApi模型验证  Framework时代    在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 复制代码 [HttpPost] public async Task<JsonResult> SaveNewCus...
1660 0
ASP.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一、案例结构总览   这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为客户端的统一入口)先向IdentityService进行Login以进行验证并获取Token,在IdentityService的验证过程中会访问数据库以验证。
2704 0
ASP.NET Core微服务之基于IdentityServer建立授权与验证服务(2)
_Tip:_ 此篇已加入.NET Core微服务基础系列文章索引 上一篇我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功获取Token了。
1809 0
|
开发框架 前端开发 NoSQL
ASP.NET Core微服务之基于IdentityServer建立授权与验证服务(1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一、IdentityServer的预备知识   要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题,涉及到Token,OAuth&OpenID,JWT,协议规范等等等等,园子里已经有很多介绍的文章了,个人觉得solenovex的这一篇文章《学习IdentityServer4的预备知识》言简意赅,可以快速的看看。
2069 0