|
源代码网推荐
结合论坛用户操作谈asp.net表单验证(上)
有了前面的知识,现在我们要进入实战。做过asp的朋友都知道表单验证是个比较头疼的问题,有经
验的Web程序员有这么一句话,那就是客户端不相信服务器端,服务器端不相信客户端。什么意思呢,就
是说做表单验证时服务器端程序不能假定客户端程序是正确的而不加检测,这样如果客户端关闭
javascript就可能造成出错,而如果只做服务器端检测,那么需要提交到服务器端再返回,那么效率会大
打折扣,并且对于用户极不方便。所以只能客户端和服务器端做两次验证。现在asp.net提供了新的表单
验证机制,下面我将结合实例简单讲一下,想要了解asp.net提供的几个验证webcontrol的详细资料,可
以参照我的asp+初级教程。 源代码网推荐在讲表单验证以前,先做点准备工作。前面谈到用asp.net开发需要转换编程思维,也就是用面向对
象的思想去考虑问题,bbs对象我们已经构造好了,现在让我们来看一下一个论坛系统中另外一个很重要
的对象:用户。可以说,论坛系统的主体是用户,没有用户那也就谈不上什么论坛了,所以围绕用户的操
作很多,比如说添加/删除用户,查询/修改用户资料等等,有些论坛还有积分机制,根据用户登录次数或
发言多少来决定积分,已表明该用户的活跃程度。那么,我们应该如何来构造论坛用户这个对象呢?看看
下面的类定义: 源代码网推荐namespace MyOwnClass 源代码网推荐{ 源代码网推荐using System; 源代码网推荐using MyOwnClass ; 源代码网推荐using System.Data.SQL ; 源代码网推荐using System.Web.Util ;
//////////////////////////////////////////////////////////////////// 源代码网推荐// 源代码网推荐// Class Name : BBSUser 源代码网推荐// 源代码网推荐// Description: 论坛用户类,构造一个论坛用户对象 源代码网推荐// 源代码网推荐// date: 2000/02/03 源代码网推荐// 源代码网推荐/// //////////////////////////////////////////////////////////////// 源代码网推荐public class BBSUser 源代码网推荐{ 源代码网推荐//新建枚举类型,创建用户方式,创建还是修改 源代码网推荐public enum CreateType 源代码网推荐{ 源代码网推荐Create = 0 , 源代码网推荐Modify 源代码网推荐}
//私有成员变量 源代码网推荐private int m_intID ; //用户ID 源代码网推荐private string m_strUserName ; //用户名 源代码网推荐private string m_strPassword ; //密码 源代码网推荐private string m_strEmail ; //用户email 源代码网推荐private string m_strHomepage ; //个人主页 源代码网推荐private string m_strSignature ; //签名
//属性,全部只读 源代码网推荐public int ID 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_intID ; 源代码网推荐} 源代码网推荐}
public string UserName 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_strUserName ; 源代码网推荐} 源代码网推荐}
public string Password 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_strPassword ; 源代码网推荐} 源代码网推荐}
public string Email 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_strEmail ; 源代码网推荐} 源代码网推荐}
public string Homepage 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_strHomepage ; 源代码网推荐} 源代码网推荐}
public string Signature 源代码网推荐{ 源代码网推荐get 源代码网推荐{ 源代码网推荐return m_strSignature ; 源代码网推荐} 源代码网推荐} 源代码网推荐//构造函数 源代码网推荐public BBSUser() 源代码网推荐{ 源代码网推荐// 源代码网推荐// TODO: Add Constructor Logic here 源代码网推荐// 源代码网推荐m_strUserName = "" ; 源代码网推荐m_strPassword = "" ; 源代码网推荐m_strEmail = "" ; 源代码网推荐m_strHomepage = "" ; 源代码网推荐m_strSignature = "" ; 源代码网推荐}
//根据用户名查询用户资料 源代码网推荐public bool GetUser(string a_strUserName) 源代码网推荐{ 源代码网推荐//如果用户名中包含单引号则抛出一个异常 源代码网推荐if (a_strUserName.IndexOf(""") != -1) 源代码网推荐{ 源代码网推荐throw(new Exception("用户名包含非法字符")) ; 源代码网推荐}
bool bExists = false ;
MyConnection myConn = new MyConnection() ; 源代码网推荐try 源代码网推荐{ 源代码网推荐myConn.Open() ; 源代码网推荐SQLCommand myCommand = new SQLCommand() ; 源代码网推荐myCommand.ActiveConnection = myConn ; 源代码网推荐myCommand.CommandText = "select * from BBSUser where
UserName="" + a_strUserName + """;
SQLDataReader myReader ; 源代码网推荐myCommand.Execute(out myReader) ; 源代码网推荐 源代码网推荐if (myReader.Read()) 源代码网推荐{ 源代码网推荐m_intID = (int)myReader["ID"] ; 源代码网推荐m_strUserName = myReader["UserName"].ToString() ; 源代码网推荐m_strPassword = myReader["password"].ToString() ; 源代码网推荐m_strEmail = myReader["Email"].ToString() ; 源代码网推荐m_strHomepage = myReader["Homepage"].ToString() ; 源代码网推荐m_strSignature = myReader["Signature"].ToString() ; 源代码网推荐bExists = true ; 源代码网推荐} 源代码网推荐else 源代码网推荐{ 源代码网推荐bExists = false ; 源代码网推荐}
myReader.Close() ; 源代码网推荐myConn.Close() ; 源代码网推荐 源代码网推荐} 源代码网推荐catch(SQLException e) //如果出现异常 源代码网推荐{
throw(new Exception("数据库异常:" + e.Message)) ; 源代码网推荐 源代码网推荐}
//返回结果 源代码网推荐return bExists ; 源代码网推荐}
//重载,根据用户ID查找用户 源代码网推荐public bool GetUser(int a_intUserID) 源代码网推荐{
bool bExists = false ;
MyConnection myConn = new MyConnection() ; 源代码网推荐try 源代码网推荐{ 源代码网推荐myConn.Open() ; 源代码网推荐SQLCommand myCommand = new SQLCommand() ; 源代码网推荐myCommand.ActiveConnection = myConn ; 源代码网推荐myCommand.CommandText = "select * from BBSUser where id=" +
a_intUserID.ToString() ;
SQLDataReader myReader ; 源代码网推荐myCommand.Execute(out myReader) ; 源代码网推荐 源代码网推荐if (myReader.Read()) 源代码网推荐{ 源代码网推荐m_intID = (int)myReader["ID"] ; 源代码网推荐m_strUserName = myReader["UserName"].ToString() ; 源代码网推荐m_strPassword = myReader["password"].ToString() ; 源代码网推荐m_strEmail = myReader["Email"].ToString() ; 源代码网推荐m_strHomepage = myReader["Homepage"].ToString() ; 源代码网推荐m_strSignature = myReader["Signature"].ToString() ; 源代码网推荐bExists = true ; 源代码网推荐} 源代码网推荐else 源代码网推荐{ 源代码网推荐bExists = false ; 源代码网推荐}
myReader.Close() ; 源代码网推荐myConn.Close() ; 源代码网推荐 源代码网推荐} 源代码网推荐catch(SQLException e) //如果出现异常 源代码网推荐{
throw(new Exception("数据库异常:" + e.Message)) ; 源代码网推荐 源代码网推荐}
//返回结果 源代码网推荐return bExists ; 源代码网推荐}
//新建用户 源代码网推荐public void CreateUser(BBSUser.CreateType a_enumCreateType ,string
a_strUserName , 源代码网推荐string a_strPassword ,
string a_strEmail , 源代码网推荐string a_strHomepage ,
string a_strSignature) 源代码网推荐{ 源代码网推荐//监测参数有效性 源代码网推荐if (a_strUserName.IndexOf(""") != -1 || a_strPassword.IndexOf(""")
!= -1 源代码网推荐|| a_strEmail.IndexOf(""") != -1 ||
a_strHomepage.IndexOf(""") != -1 源代码网推荐|| a_strSignature.IndexOf(""") != -1) 源代码网推荐{ 源代码网推荐throw(new Exception("包含非法字符")) ; 源代码网推荐}
try 源代码网推荐{ 源代码网推荐MyOwnClass.MyConnection myConn = new MyConnection() ; 源代码网推荐SQLCommand myCmd = new SQLCommand() ;
//判断是新建用户还是修改用户资料 源代码网推荐if (a_enumCreateType == BBSUser.CreateType.Create) 源代码网推荐{ 源代码网推荐myCmd.CommandText = "insert into BBSUser(UserName ,
Password , Email , Homepage , Signature)" 源代码网推荐+ "values("" + a_strUserName + "",""
+ a_strPassword + "","" 源代码网推荐+ a_strEmail + "","" + a_strHomepage
+ "","" + a_strSignature + "")" ; 源代码网推荐} 源代码网推荐else 源代码网推荐{ 源代码网推荐myCmd.CommandText = "update BBSUser set Email="" +
a_strEmail 源代码网推荐+ "" , Homepage="" + a_strHomepage + "" ,
Signature="" 源代码网推荐+ a_strSignature + "" where username="" +
a_strUserName + """; 源代码网推荐} 源代码网推荐myConn.Open() ; 源代码网推荐myCmd.ActiveConnection = myConn ; 源代码网推荐myCmd.ExecuteNonQuery() ; 源代码网推荐myConn.Close() ;
} 源代码网推荐catch(SQLException exp) 源代码网推荐{ 源代码网推荐throw(new Exception("数据库出错:" + exp.Message)) ; 源代码网推荐}
}
//取回密码 源代码网推荐public void GetPassword(string a_strUserName , string a_strEmail) 源代码网推荐{
if (GetUser(a_strUserName) && m_strEmail == a_strEmail) 源代码网推荐{ 源代码网推荐//发送Email 源代码网推荐System.Web.Util.MailMessage myMail = new MailMessage() ; 源代码网推荐myMail.From = "lyp@server1.domain" ; 源代码网推荐myMail.Subject = "取回您的密码" ; 源代码网推荐myMail.Body = "请牢记您的密码:" + m_strPassword ; 源代码网推荐myMail.To = a_strEmail ; 源代码网推荐SmtpMail.Send(myMail) ; 源代码网推荐} 源代码网推荐else 源代码网推荐{ 源代码网推荐throw (new Exception("该用户不存在")) ; 源代码网推荐} 源代码网推荐} 源代码网推荐 源代码网推荐} 源代码网推荐}
通过前面的学习,你可能已经能够看懂这个类定义的大部分内容,那些是成员变量,那些是属性,那
些是方法都可以理解了,在这里需要解释的只有以下两部分内容,首先看这段代码: 源代码网推荐 源代码网推荐public enum CreateType 源代码网推荐{ 源代码网推荐Create = 0 , 源代码网推荐Modify 源代码网推荐} 源代码网推荐这段代码的作用是创建BBSUser类的一个枚举变量,写过c程序的朋友很容易理解,建立这个枚举变量
的作用是简化记忆,用容易记忆的名称代替值,比如上边这个定义,当在方法CreateUser里作为第一个参
数时,BBSUser.CreateType.Create实际的值是0,代表这个方法的目的是创建用户,而如果是
BBSUser.CreateType.Modify,则代表目的是修改用户资料。显而易见,用if (a_enumCreateType ==
BBSUser.CreateType.Create)这样的语句比用if (a_intCreateTYpe == 1)更容易记忆,最大限度减少出
错的可能。
另外一个要解释的内容是:你可能已经注意到在类的定义中有两个 GetUser方法的定义,其作用域和
返回值都相同,只是参数类型不同。没错,这种做法叫重载(override),是并且只能是面向对象程序语言
实现多态性的基本方法,那么这样做有什么好处呢?就是根据参数不同由类自己决定应该调用那个正确的
方法,这样讲可能有些抽象,那么举个例子来说吧,这个GetUser方法的作用是取得用户资料,那么它可
以通过用户名来取得资料,也可以通过用户ID来取得,如果不用函数的重载,那么我们需要建两个函数,
可能一个叫GetUserFromName(string a_strName) , 而另一个是GetUserFormID(int a_intID),在调用时
需要判断一下决定调用那个方法,象这样: 源代码网推荐if ( BBSUser.ID != "") 源代码网推荐{ 源代码网推荐GetUserFromID(BBSUser.ID) ; 源代码网推荐} 源代码网推荐else if(BBSUser.Name != "") 源代码网推荐{ 源代码网推荐GetUserFromName(BBSUser.Name) ; 源代码网推荐}
以上两种方法孰优孰劣恐怕已经不用我说了吧。 源代码网推荐好了,既然我们已经创建好BBSUser对象,下面就可以利用它来进行对用户的操作了。
源代码网供稿. |