(2010-08-22)关于用ASP.NET建网站时登录验证的总结

  记得刚学asp.net,并用它来建网站做系统时,都是比较喜欢贪图方便,用控件来实现一些功能的。比如做系统登录功能时的验证这功能,asp.net提供了验证控件,要想验证用户名、密码不为空直接拖个验证控件并修改下验证控件绑定文本框等属性就实现了需求。再比如清空或者取消功能也总是喜欢拖个服务端BUTTON控件,然后在后台用代码实现清空、取消功能。再比如实现checkbox全选、全不选等功能也是如此。而甚少考虑性能等方面的问题,只是为了实现功能而思考,也就是说这之前自己思考问题都是很少考虑性能问题的,而只是单纯的考虑功能实现。

  如今学asp.net一年多了,做了几个项目,才发现做系统时要时刻考虑性能方面的问题,而像上面提到的即使很简单的功能也用控件实现的话无疑加重了服务器的压力,因为验证控件,后台代码实现都是在服务端处理的,这样性能就下降了很多。现在开发模式提倡的是胖客户端模式,也就是说能在客户端实现的尽量放到客户端实现,就比如用验证控件实现注册功能,当然可以用RequiredFieldValidator控件(如果对性能要求不高的话),但更好的方法是用js来实现验证。因为JS在客户端做验证,使用验证控件是在服务器段做验证。还有一种情况就是在验证用户名是否存在时流行也是科学的做法是用ajax实现异步提取。在这里就单独以登陆功能来讲,个人认为在建设网站时,应使用JS+服务器双重验证(如果是对安全性有要求的)。因为JS在客户端运行,是可以跳过验证的。如果单单使用JS验证,可能会存在安全隐患。且不同的浏览器对JS的支持也是不同的。
下面就举例来说明下吧:

功能实现:ASP.NET验证控件客户端验证成功或失败之后执行js脚本

要求:表单中用了验证控件,如何能在验证控件的客户端脚本验证成功之后,执行一段js脚本,比如弹出确认框,然后再提交,点取消则不提交。如果验证控件没通过,比如用户没填名字的话,不会提交。
网上看了一些文章,有的说不可能,有的则是使用服务端代码,需要提交页面后才能正确执行。

下面的代码的测试环境是VS.NET2008+IE8,没有后台代码:
原理:ASP.NET验证控件在生成网页的时候会变成一大堆的客户端 Javascript 脚本,用来在客户端验证。
1. 先敲入以下代码(ValidateControl.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ValidateControl.aspx.cs" Inherits="ValidateControl" %>
<!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="form1" runat="server">
    <div>
    
        <asp:Label ID="Label1" runat="server" Text="用户名:"></asp:Label>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
            ControlToValidate="TextBox1" ErrorMessage="用户名必须输入!"></asp:RequiredFieldValidator>
        

        <asp:Button ID="Button1" runat="server" Text="提交" />
    
    </div>
    </form>
</body>
</html>

2. 运行该页面,在IE中“查看原文件”
生成下面这些关键代码(摘录关键的几行):
...
<formname="form1" method="post" action="ValidateControl.aspx" language="javascript" onsubmit="javascript:return WebForm_OnSubmit();" id="form1">
...
function WebForm_OnSubmit() {

if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;

return true;
}

可以看出form1表单是通过WebForm_OnSubmit函数验证,如果返回false则表示失败,不提交数据;true提交数据

而WebForm_OnSubmit函数又是调用ValidatorOnSubmit函数来执行验证的,ValidatorOnSubmit返回false表示验证失败。

3. 利用ValidatorOnSubmit函数验证控件
回到第一步最初的代码,将<form id="form1" runat="server">改成:
    <form id="form1" runat="server" onsubmit="if(ValidatorOnSubmit() == true) return confirm('确认提交数据吗?');">

再次运行ValidateControl.aspx页面,实现了最初的目的。
再次在IE中“查看源文件”WebForm_OnSubmit函数被改成了:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;if
(ValidatorOnSubmit() == true) return confirm('确认提交数据吗?');
return true;
}

基于以上原理,还可以把代码简化为:
    <form id="form1" runat="server" onsubmit="return confirm('确认提交数据吗?');">
你可以通过这种方式插入自己想要的js代码。

你可能感兴趣的:(JavaScript,server,asp.net,webform,textbox,2010)