ASP.NET三层结构演化构建之一——混沌

作为这个系列博文的首篇,难免要在开头废话几句。

网上ASP.NET三层结构的文章也不少了。我看了一下,都写的很好。有的也手把手的教了如何建立三层结构的ASP.NET网站。但是我认为针对初学者,对于三层结构思想的理解也是十分重要的。有的人虽然会使用,但是具体原因的说不清,初学者对于有些编程手法更是满头雾水。针对这个情况,忙于拯救地球的我不得不放下手中的工作,推出三层结构演化构建系列博客。希望能借这个系列的博文与大家交流交流。嘿嘿。

 

分层开发的优势我在这里就先不提了。因为我对三层的介绍还没开始。这就像指着空气让人意淫一样,是很不科学的。以后我会结合具体的例子来逐步介绍。

 

现在我要建立一个简单的普通的ASP.NET班级管理系统。作为这个博客系列的例子,我会对其进行不断演化。

 

我使用的工具是Visual Studio 2008+SQL Server 2005

 

首先我们仅仅是讨论用户登录的功能。

 

作为一个基础知识极端扎实的小鸟,一个用户登录写起来还是没什么问题的。我相当自信。

 

首先是建库和建表。这里给出了相应的T-SQL语句。

 

--建库

create database StudentMIS

go

use StudentMIS

go

 

--建表

CREATE TABLE [User](

UserId int IDENTITY(1,1) NOT NULL, --用户ID

Password varchar(50)  NOT NULL CONSTRAINT DF_User_Password  DEFAULT '0', --用户密码

IsAdmin bit NOT NULL CONSTRAINT DF_User_IsAdmin  DEFAULT ((0)), --是否为管理员,True表示为管理员,False表示不是。默认值为False

UserName nvarchar(50), --用户姓名

Sex bit, --用户性别,True表示男,False表示女

Age smallint, --用户年龄

 CONSTRAINT PK_User PRIMARY KEY CLUSTERED 

(

UserId ASC --UserId设置为主键

)

)

go

 

--插入数据,头四个是普通用户。Han Meimei是管理员。因为她跟我关系比较好啦。

INSERT INTO [User] (UserName,IsAdmin,Sex,Age) VALUES('Han Meimei',1,0,18)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Li Lei',1,19)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Jim Green',1,18)

INSERT INTO [User] (UserName,Sex,Age) VALUES('Lucy',0,17)

建好之后如图:

 

 

表中数据如图: 

 

现在开始写界面。

 

打开Visual Studio 2008

点击文件->新建项目,在弹出的对话框的左边中点选其他项目类型下的Visual Studio解决方案,如图:

 

选择右边的空白解决方案,并且选择解决方案的名称和位置。位置在F盘的根目录下(当然,您可以决定放在哪里)。为了拉风一点,我们这里起名为StudentMIS,意思是学生管理信息系统。然后点击确认。

 

为什么要新建空白的解决方案呢。我们现在要做的是一个分层次的系统。每一个层次都是一个项目。这些项目需要一个解决方案作为容器,有了解决方案,我们可以在解决方案中添加新的项目。这样方便我们的管理。

 

建完解决方案如图所示:

 

 

右击解决方案StudentMIS,选择添加->新建网站,弹出以下对话框:

 

 

这里我们选择ASP.NET网站。注意位置,为了使项目好管理,我们将位置设在刚才创建解决方案的目录下的Web文件夹中。这样使得解决方案和项目在一块。要移动或者是复制的时候都方便。点击确定。

 

在我们建立的网站中删除Default.aspx,添加两个页面:Login.aspxIndex.aspx,并将Login.aspx设置为起始页。这时候的项目解决方案视图如图所示:

计划是这样的。Login.aspx是登陆页面。如果登陆成功,则跳转到Index.aspx页面,如果失败,则弹出失败的提示。

 

Login.aspx的内容为:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>

 

<!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>Login</title>

</head>

<body>

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

    <div>

        <asp:Label ID="lblUserId" runat="server" Text="UserId:"></asp:Label>

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

        <br />

        <asp:Label ID="lblPassword" runat="server" Text="Password:"></asp:Label>

        <asp:TextBox ID="tbxPassword" runat="server" TextMode="Password"></asp:TextBox>

        <br />

        <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" />

    </div>

    </form>

</body>

</html>

 

后台代码Login.aspx.cs的代码为:

 

using System;

using System.Data.SqlClient;

 

public partial class Login : System.Web.UI.Page

{

    protected void btnLogin_Click(object sender, EventArgs e)

    {

        if (tbxUserId.Text.Length == 0 || tbxPassword.Text.Length == 0) return;//若账号密码为空,则返回

        SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建连接

        SqlCommand cmd = new SqlCommand("select password from [User] where UserId=" + tbxUserId.Text, conn);//新建命令,根据文本框tbxUserId中的值查询数据库中相应记录的Password值

        conn.Open();//打开连接

        Object obj = cmd.ExecuteScalar();//执行语句,返回第一行第一列结果

        conn.Close();//关闭连接

        if (obj != null && obj.ToString() == tbxPassword.Text)//若查询结果不为空且与文本框tbxPassword中的值相等

            Response.Redirect("Index.aspx");//跳转到Index.aspx

        else

        {

            tbxUserId.Text = "";//清空tbxUserId中的值

            tbxPassword.Text = "";//清空tbxPassword中的值

        }

    }

}

 

Index.aspx的内容为:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Index" %>

 

<!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>

        Welcome

        <%=UserName %>

    </div>

    </form>

</body>

</html>

 

后台代码Index.aspx.cs的内容为:

using System;

using System.Data.SqlClient;

 

public partial class Index : System.Web.UI.Page

{

    public string UserName;//用户名

    protected void Page_Load(object sender, EventArgs e)

    {

        SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建连接

        SqlCommand cmd = new SqlCommand("select UserName from [User] where UserId=" + Request["UserId"], conn);//新建命令,根据请求的UserId中的值查询数据库中相应记录的UserName值

        conn.Open();//打开连接

        Object obj = cmd.ExecuteScalar();//执行语句,返回第一行第一列结果

        conn.Close();//关闭连接

        if (obj != null)

            UserName = obj.ToString();

    }

}

 

 

 

写完后运行。效果如下图:

 

UserId:后面的文本框中输入1,Password:后面的文本框中输入0,点击Login,登录成功,跳转到Index.aspx。如图:

 

 

任务就这样简单完成了。简直是太容易了。我真是人才。

 

但是。这样有什么弊端呢。

 

这个项目就我一个人开发。所以没啥问题。如果是一个大项目,一个大公司,有几十号甚至几百号人共同开发。如何分工协作。写界面的是我,写业务逻辑的是我,写数据库连接的还是我。那其他人要干嘛呢。给人家留口饭吃嘛。做人要厚道。

有的人说,分工进行。好嘛。看看我们的代码,所有的处理都是在一个文件里,叫人如何分工呢。

明白了。分层嘛。分几层呢。三层。表示层,业务逻辑层,数据访问这三层。

敬请关注下一篇:ASP.NET三层结构演化构建之二——三层肚皮

 

项目示例下载:http://download.csdn.net/source/2946951 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值