看到好东西,备份一下

  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聊天窗口的效果,效果可看下图:

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




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

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

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

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

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

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

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

  以下是源码:


打造自己的asp.net验证控件_asp.net_08打造自己的asp.net验证控件_asp_09<%

... @ Page Language="C#" AutoEventWireup="true" CodeBehind="myvalid.aspx.cs" Inherits="Test.myvalid"  %>

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

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

< html  xmlns ="http://www.w3.org/1999/xhtml"   >

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

< head  runat ="server" >

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

< title > 无标题页 </ title >

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

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

< style > ...

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

打造自己的asp.net验证控件_textbox_17    border-top:solid 1px #C6C3C6;

打造自己的asp.net验证控件_textbox_17    height:6px;

打造自己的asp.net验证控件_textbox_17    background-color:#FFFBEF;

打造自己的asp.net验证控件_textbox_17    font-size:1px;

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

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

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

打造自己的asp.net验证控件_textbox_17    BACKGROUND: url(images/vMsgL.gif)  no-repeat left top;

打造自己的asp.net验证控件_textbox_17    width:7px;

打造自己的asp.net验证控件_textbox_17    height:6px;

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

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

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

打造自己的asp.net验证控件_textbox_17    BACKGROUND: url(images/vMsgR.gif)  no-repeat  ;

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

打造自己的asp.net验证控件_textbox_17    width:24px;

打造自己的asp.net验证控件_textbox_17    height:6px;

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

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

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

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

打造自己的asp.net验证控件_textbox_17    BACKGROUND: url(images/vMsgBL.gif)  no-repeat left top;

打造自己的asp.net验证控件_textbox_17     width:7px;

打造自己的asp.net验证控件_textbox_17    height:6px;

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

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

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

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

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

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

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

打造自己的asp.net验证控件_textbox_17    BACKGROUND: url(images/vMsgBC.gif)  repeat-x;

打造自己的asp.net验证控件_textbox_17    height:19px;

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

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20{...}{

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

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

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

打造自己的asp.net验证控件_textbox_17    BACKGROUND: url(images/vMsgBR.gif)  no-repeat left top;

打造自己的asp.net验证控件_textbox_17    width:24px;

打造自己的asp.net验证控件_textbox_17    height:19px;

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

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

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

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

</ style >

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

</ head >

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

< body  style ="font-size:12px" >

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

< form  id ="form1"  runat ="server" >

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

< div  style ="font-weight:bold;height:60px" >  打造自己的验证控件: </ div >

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

打造自己的asp.net验证控件_textbox_10        姓名:

< asp:TextBox  ID ="TextBox1"  runat ="server" ></ asp:TextBox >

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

< asp:RequiredFieldValidator  ID ="RequiredFieldValidator1"  runat ="server"  Display ="dynamic"  ControlToValidate ="TextBox1"

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

="请输入姓名!"  SetFocusOnError ="True" ></ asp:RequiredFieldValidator >< br  />

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

< asp:TextBox  ID ="TextBox2"  runat ="server" ></ asp:TextBox >

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

< asp:RequiredFieldValidator  ID ="RequiredFieldValidator2"  runat ="server"  Display ="dynamic"  ControlToValidate ="TextBox2"

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

="请输入证件号!"  SetFocusOnError ="True" ></ asp:RequiredFieldValidator >

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

< asp:RegularExpressionValidator  ID ="RegularExpressionValidator1"  runat ="server"   Display ="dynamic"  ControlToValidate ="TextBox2"

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

="证件号格式不符!"  ValidationExpression ="d{17}[d|X]|d{15}" ></ asp:RegularExpressionValidator >< br  />

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

< asp:Button  ID ="Button1"  runat ="server"  Text ="确定"   />

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

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

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

</ form >

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

</ body >

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

</ html >

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

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

< script  type ="text/javascript" > ...

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20 function ValidatorUpdateDisplay(val) ...{

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20    if (typeof(val.display) == "string") ...{

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20        if (val.display == "None") ...{

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20        if (val.display == "Dynamic") ...{

打造自己的asp.net验证控件_textbox_17            //val.style.display = val.isvalid ? "none" : "inline";

打造自己的asp.net验证控件_textbox_17           // return;

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

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

打造自己的asp.net验证控件_textbox_17    if ((navigator.userAgent.indexOf("Mac") > -1) &&

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20        (navigator.userAgent.indexOf("MSIE") > -1)) ...{

打造自己的asp.net验证控件_textbox_17        val.style.display = "inline";

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

打造自己的asp.net验证控件_textbox_17    ShowZfValidMsg(val);

打造自己的asp.net验证控件_textbox_17   // val.style.visibility = val.isvalid ? "hidden" : "visible";

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

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

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20function Page_ClientValidate(validationGroup) ...{

打造自己的asp.net验证控件_textbox_17    Page_InvalidControlToBeFocused = null;

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20    if (typeof(Page_Validators) == "undefined") ...{

打造自己的asp.net验证控件_textbox_17        return true;

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

打造自己的asp.net验证控件_textbox_17    var i;

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20    for (i = 0; i < Page_Validators.length; i++) ...{

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

打造自己的asp.net验证控件_textbox_17        ValidatorValidate(Page_Validators[i], validationGroup, null);

打造自己的asp.net验证控件_textbox_17        //Added By zhaofeng

打造自己的asp.net验证控件_textbox_17        if(!Page_Validators[i].isvalid)// only show one  errmsg

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

打造自己的asp.net验证控件_textbox_17            Page_IsValid = false;

打造自己的asp.net验证控件_textbox_17            Page_BlockSubmit = !Page_IsValid;

打造自己的asp.net验证控件_textbox_17            return false;

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

打造自己的asp.net验证控件_textbox_17        //Added End

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

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

打造自己的asp.net验证控件_textbox_17    ValidatorUpdateIsValid();

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

打造自己的asp.net验证控件_textbox_17    ValidationSummaryOnSubmit(validationGroup);

打造自己的asp.net验证控件_textbox_17    Page_BlockSubmit = !Page_IsValid;

打造自己的asp.net验证控件_textbox_17    return Page_IsValid;

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

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

打造自己的asp.net验证控件_textbox_17function ShowZfValidMsg(val)

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

打造自己的asp.net验证控件_textbox_17    //window.status = val.isvalid;

打造自己的asp.net验证控件_textbox_17    var tbId  = "tbValidMsg";//+val.controltovalidate;

打造自己的asp.net验证控件_textbox_17    var tb = document.getElementById(tbId);

打造自己的asp.net验证控件_textbox_17    if(val.isvalid && tb == null) return;

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

打造自己的asp.net验证控件_textbox_17    if(tb == null)

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

打造自己的asp.net验证控件_textbox_17        tb = document.createElement("table");

打造自己的asp.net验证控件_textbox_17        tb.border= 0 ;

打造自己的asp.net验证控件_textbox_17        tb.id = tbId;

打造自己的asp.net验证控件_textbox_17        tb.cellSpacing = 0 ;

打造自己的asp.net验证控件_textbox_17        tb.cellPadding = 0 ;

打造自己的asp.net验证控件_textbox_17        var tr = tb.insertRow(0);

打造自己的asp.net验证控件_textbox_17        var cell = tr.insertCell(0);

打造自己的asp.net验证控件_textbox_17        cell.className = "MsgL";

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

打造自己的asp.net验证控件_textbox_17        cell =  tr.insertCell(1);

打造自己的asp.net验证控件_textbox_17        cell.className  = "MsgC";

打造自己的asp.net验证控件_textbox_17        cell.innerHTML = "&nbsp;";

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

打造自己的asp.net验证控件_textbox_17        cell =  tr.insertCell(2);

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

打造自己的asp.net验证控件_textbox_17        cell.className  = "MsgR";

打造自己的asp.net验证控件_textbox_17        //the second row

打造自己的asp.net验证控件_textbox_17        tr = tb.insertRow(1);

打造自己的asp.net验证控件_textbox_17        cell = tr.insertCell(0);

打造自己的asp.net验证控件_textbox_17        cell.bgColor = "#FFFBEF";

打造自己的asp.net验证控件_textbox_17        cell.style.cssText=  "border-left:solid 1px #C6C3C6";

打造自己的asp.net验证控件_textbox_17        cell.innerHTML = "&nbsp;"

打造自己的asp.net验证控件_textbox_17        cell = tr.insertCell(1);

打造自己的asp.net验证控件_textbox_17        cell.bgColor = "#FFFBEF";

打造自己的asp.net验证控件_textbox_17        cell.height  = 40;

打造自己的asp.net验证控件_textbox_17        cell.innerHTML = "<div style='float:left;padding-top:1px'><img src='images/yellowalert.gif' /></div>"+

打造自己的asp.net验证控件_textbox_17        "<span style='color:black;font-size:12px;height:40px;width:100px;padding-top:10px;padding-bottom:10px;padding-right:0px;padding-left:3px'></span>";

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

打造自己的asp.net验证控件_textbox_17        cell = tr.insertCell(2);

打造自己的asp.net验证控件_textbox_17        cell.bgColor = "#FFFBEF";

打造自己的asp.net验证控件_textbox_17        cell.style.cssText=  "border-right:solid 1px #C6C3C6";

打造自己的asp.net验证控件_textbox_17        cell.innerHTML = "&nbsp;"

打造自己的asp.net验证控件_textbox_17        //the third row

打造自己的asp.net验证控件_textbox_17        tr = tb.insertRow(2);

打造自己的asp.net验证控件_textbox_17        cell = tr.insertCell(0);

打造自己的asp.net验证控件_textbox_17        cell.className = "MsgBL";

打造自己的asp.net验证控件_textbox_17        cell =  tr.insertCell(1);

打造自己的asp.net验证控件_textbox_17        cell.innerHTML = "&nbsp;";

打造自己的asp.net验证控件_textbox_17        cell.className  = "MsgBC";

打造自己的asp.net验证控件_textbox_17        cell =  tr.insertCell(2);

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

打造自己的asp.net验证控件_textbox_17        cell.className  = "MsgBR";

打造自己的asp.net验证控件_textbox_17        document.body.appendChild(tb);

打造自己的asp.net验证控件_textbox_17        tb.style.cssText= "position:absolute;zIndex:500";

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

打造自己的asp.net验证控件_textbox_17    tb.rows[1].cells[1].childNodes[1].innerHTML = val.innerHTML;

打造自己的asp.net验证控件_textbox_17    tb.style.display = val.isvalid?"none":"";

打造自己的asp.net验证控件_textbox_17    var obj = document.getElementById(val.controltovalidate);

打造自己的asp.net验证控件_textbox_17    if(obj !=null)

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

打造自己的asp.net验证控件_textbox_17        var ary = GetElePos(obj);

打造自己的asp.net验证控件_textbox_17        var l = ary[0]+obj.offsetWidth-tb.offsetWidth;

打造自己的asp.net验证控件_textbox_17        if(l<0) l= 0 ;

打造自己的asp.net验证控件_textbox_17        var t = ary[1]-tb.offsetHeight+15;

打造自己的asp.net验证控件_textbox_17        if(t<0) t = 0 ;

打造自己的asp.net验证控件_textbox_17        tb.style.left = l 

打造自己的asp.net验证控件_textbox_17        tb.style.top = t;

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

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

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

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

打造自己的asp.net验证控件_textbox_17  function GetElePos(e)

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

打造自己的asp.net验证控件_textbox_17        var t=e.offsetTop; 

打造自己的asp.net验证控件_textbox_17         var l=e.offsetLeft; 

打造自己的asp.net验证控件_function_19打造自己的asp.net验证控件_textbox_20         while(e=e.offsetParent)...{ 

打造自己的asp.net验证控件_textbox_17         t+=e.offsetTop; 

打造自己的asp.net验证控件_textbox_17         l+=e.offsetLeft; 

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

打造自己的asp.net验证控件_textbox_17         return [l, t];

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

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

</ script >


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