转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
asp.net高级教程(四)---实战篇(上)         ★★★★

asp.net高级教程(四)---实战篇(上)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:605 更新时间:2009/4/23 10:39:07
结合论坛用户操作谈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程序的朋友很容易理解,建立
这个枚举变量

的作用是简化记忆,用容易记忆的名称代替值,比如上边这个定义,当在方法CreateUse
r里作为第一个参

数时,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对象,下面就可以利用它来进行对用户的操作了。


[C语言系列]NET 中C#的switch语句的语法  [系统软件]托拽Explore中的文件到VB.net的窗口
[系统软件]Boost库在XP+Visual C++.net中的安装  [常用软件]新配色面板:Paint.Net3.0RC1官方下载
[常用软件]用内建的“Net Meeting”聊天  [VB.NET程序]Henry的VB.NET之旅(三)—共享成员
[VB.NET程序]Henry的VB.NET之旅(二)—构造与析构  [VB.NET程序]Henry的VB.NET之旅(一)—失踪的窗体
[VB.NET程序]在托盘上显示Balloon Tooltip(VB.NET)  [VB.NET程序]Henry手记-VB.NET中动态加载Treeview节点(二)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台