杨洋疯狂C# 刊号:201208 第1期----ASPNET验证(一)
时间:2012年08月08日 15点 地点:上海 天气:”海葵“台风
掌握目标:Asp.NET里面的正则验证,JS提示处理结果的几种方式
涉及内容:System.Text.RegularExpressions,Asp.NET的工具箱里面的验证工具使用,JQuery版的前端验证,JQuery验证插件的使用,正则表达式元字符的学习和使用,通用的,一个正则表达式工具的介绍和使用,后台JS提示方式等
案例:一个注册页面的验证(主要前端),一个注册页面用Asp.NET写的页面,一个自定义具有验证功能的自定义控件
① .NET版本验证(System.Text.RegularExpressions)
案例1:验证电话号码---------学习^$,?,{},(),\d
总代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="validateForm" runat="server"> <div> <asp:TextBox ID="txtPhoneValidate" runat="server"></asp:TextBox> <asp:Button ID="btnPhoneValidate" runat="server" Text="验证电话号码" onclick="btnPhoneValidate_Click" /> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text.RegularExpressions; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } #region 电话号码验证 //①验证电话号码XXXX-XXXXXXXX(前面3个或4个,后面6个或7个或8个) // \d代表数字,{}限定前面这个元字符的长度,这里{3,4}表示3个数字或者4个数字,你懂的^$表示一段正则的开始和结束,括弧表示一个整体 // “? 号表示0次或者1次 public bool isTelephone(string phoneValidate) { return Regex.IsMatch(phoneValidate, @"^(\d{3,4}-)?\d{6,8}$"); } protected void btnPhoneValidate_Click(object sender, EventArgs e) { // if (Page.IsValid) { //获得一个值表示此页面是否验证成功! if (isTelephone(txtPhoneValidate.Text)) { //用JS提示的3种方法 //①response.write() string scripts = "<script>alert('电话号码验证成功');</script>"; Response.Write(scripts); } else { string scripts = "<script>alert('电话号码验证失败');</script>"; Response.Write(scripts); } // } } #endregion }
其他学习(几种JS提示的区别):
最开始源代码的样子 ↓
分支①(Reponse.Write的JS提示):
I . Response.Write模式JS提示完的样子(上面多了一句脚本)
II. Page.ClientScript.RegisterClientScriptBlock()
由下图看到了它有3个参数,下面也有说明
把Reponse.Write注释后,换成这种JS提示方法,网页源码变成了这样
if (isTelephone(txtPhoneValidate.Text)) { //用JS提示的3种方法 //①response.write() string scripts = "<script>alert('电话号码验证成功');</script>"; //Response.Write(scripts); Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"phoneValidateSuccessTip",scripts); } else { string scripts = "<script>alert('电话号码验证失败');</script>"; //Response.Write(scripts); Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "phoneValidateSuccessTip", scripts); }
III. Page.ClientScript.RegisterStartupScript()
也是3个参数:
IV. 其实还有一种提示技巧,在前台页面添加一个Literal控件
<form id="validateForm" runat="server"> <div> <asp:Literal ID="ltResult" runat="server"></asp:Literal> <asp:TextBox ID="txtPhoneValidate" runat="server"></asp:TextBox> <asp:Button ID="btnPhoneValidate" runat="server" Text="验证电话号码" onclick="btnPhoneValidate_Click" /> </div> </form>
后台代码
// if (Page.IsValid) { //获得一个值表示此页面是否验证成功! if (isTelephone(txtPhoneValidate.Text)) { //用JS提示的3种方法 //①response.write() string scripts = "<script>alert('电话号码验证成功');</script>"; //Response.Write(scripts); //Page.ClientScript.RegisterClientScriptBlock(this.GetType(),"phoneValidateSuccessTip",scripts); //Page.ClientScript.RegisterStartupScript(this.GetType(), "phoneValidateSuccessTip", scripts); ltResult.Text = scripts ; } else { string scripts = "<script>alert('电话号码验证失败');</script>"; //Response.Write(scripts); //Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "phoneValidateSuccessTip", scripts); //Page.ClientScript.RegisterStartupScript(this.GetType(), "phoneValidateFailTip", scripts); ltResult.Text = scripts; }
页面提示网页源代码,literal控件的位置变成一行JS代码块了
应该在后台提示js的方法肯定还有,在我提示的这几个里面 RegisterStartupScript()提示时候,浏览器没有先白屏然后再跳转回去,其他的都是白屏过后
其他:
当使用者第一次浏览这个网页时Page.IsPostBack 会传回False,所以一般用if(!Page.IsPostBack){ 第一次浏览我就这样做,比如绑定数据 }
Page.IsValid等于True的话,则整个页面验证通过,常和asp.net的相关验证控件配合
为了避免注册重复脚本,可以用以下方式判断
Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(),"键名称") 验证 RegisteredClientScriptBlock()方式的script键名
Page.ClientScript.IsStartupScriptRegistered(this.GetType(),"键名称") 验证 RegisteredStartupScript()方式的script键名
普通HTML标签可以在后台访问该元素:正常写HTML标签,然后加一个runat="server"和 id
例如:
<input id="btnDel" type="submit" value="删除" runat="server"/> <%--给这个按钮在后台添加个属性--%>
后台给它添加个属性,IsPostBack和Page.IsPostBack是一样的
if (!IsPostBack) { this.btnDel.Attributes.Add("onclick","return confirm('是否删除')"); }
②在Page_Load添加如下代码,F5运行时直接跳转到ValidateSuccess.aspx页面去了,然后改变地址栏地址为Default.aspx也无效,这就是页面第一次加载执行的代码,很无聊
对吧,我也这么认为
//测试Page.IsPostBack if (!Page.IsPostBack) { Response.Redirect("ValidateSuccess.aspx"); }
③把!号去掉,表示第二次访问该页面时触发跳转到其他页面去,页面直接显示Default.aspx的内容了,此时单击验证按钮,不管是否验证成功,也不提示JS指定脚本了,直接跳到ValidateSuccess.aspx页面去了,因为ASP.NET存在着 回发机制 ,这里不赘述了,别人讲的比我好,如果你不会想知道,你可以搜索 ”asp.net回发机制“关键字来学习
回发机制相关链接:http://blog.sina.com.cn/s/blog_7815564501012qgy.html
http://jerikc.blog.163.com/blog/static/18943418620111173354795/
④把Response.Redirect("ValidateSuccess.aspx");注释掉,在Page_Load事件里添加 btnPhoneValidate.PostBackUrl = "ValidateSuccess.aspx";
按F5运行,点击按钮,直接回发到了ValidateSuccess.aspx页面去了
⑤在前台的那个验证按钮里面加上 OnClientClick="return false;" 阻止回发,但是这不是关键,我们常常在 OnClientClick="一个定义好的JS函数名称",例如这个JS函数名称
叫做A,A里面的JS代码用来验证页面上的元素或者其他的,如果在这个函数里面加了个return true;那么接着就会调用 onclick事件的代码了。所以PostBackUrl我个人认为没
什么用,当超链接吗?其实超链接还有LinkButton和HyberLink;再说还有HTML标签里面就有个<a>,直接在前台拼接它的链接地址就行了,这里不做赘述了,我个人感觉
能少用服务器控件就少用
<asp:Button ID="btnPhoneValidate" runat="server" Text="验证电话号码" onclick="btnPhoneValidate_Click" OnClientClick="return false;"/>
⑥上一期,自己犯了一个很大的错误,就是把所有要写的东西写在了一个页面里了,查看很不方便,从这期开始,将分随笔写好,然后放在索引页里面仅供参考。代码不上传了,很简单,要的可以qq联系。这次写的很简单,不好意思