三层架构例子
一、下载动软软件(http://www.maticsoft.com/),或者从教师机的ftp上直接下载。
二、打开SQL Server2000企业管理器,附加数据库ShopDB。
三、运行“动软.Net代码生成器”
四、在“常用操作”-》选择“新增数据库服务器”-》“SQL Server”,接下来在服务器类型中选择“SQL Server2000”,点击“连接/测试”成功后,在数据库中选择“ShopDB”,点击“确定”,如果有出错提示,不用管它。
五、在左侧的“服务器”中,点击右键“刷新”,则会出现刚才的数据库节点,接着在数据库节点点击右键“连接服务器”。
六、在“常用操作”-》选择“生成代码项目”,名称为“Shop”,设置保存代码的位置,接下来把表都添加进来,然后点击“开始生成”。
七、生成的项目文件如下:
八、打开“Shop”解决方案文件。
Model,模型层,一个模型对应一张表,一般不改。 |
BLL,业务逻辑层,被页面调用,需要大量扩充。 |
WEB,页面展示层,需要大量扩充。 |
DAL,数据访问层,隐藏在后台,少量修改。 |
数据的操作关系:页面-》BLL-》DAL
尽量避免页面直接访问DAL,也就是页面中不涉及数据库的查询语句。
九、修改web.config配置文件中的数据库连接参数。
<add key="ConnectionString" value="server=127.0.0.1;database=ShopDB;uid=sa;pwd="/>
十、在“web”项目中的“Controls”文件夹,添加一个“Header.ascx”用户控件,控件的标签代码如下:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Header.ascx.cs" Inherits="Maticsoft.Web.Header" %>
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="~/Default.aspx">首页</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="~/UserReg.aspx">用户注册</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="~/ProductView.aspx">产品浏览</asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="~/OrderView.aspx">查看订单</asp:LinkButton>
<asp:LinkButton ID="LinkButton5" runat="server" PostBackUrl="~/Admin/Login.aspx">后台管理</asp:LinkButton>
效果图:
十一、 打开母版页“MasterPage.master”,把“Header.ascx”用户控件拖放到顶部位置。
十二、 添加一个UserReg.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个注册页面如下图所示:
参考标签代码(注意控件的ID属性):
<table border="0">
<tr>
<td style="width: 88px">
用户名:</td>
<td style="width: 100px">
<asp:TextBox ID="tb_UserName" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 88px">
真实姓名:</td>
<td style="width: 100px">
<asp:TextBox ID="tb_TrueName" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 88px">
密 码:</td>
<td style="width: 100px">
<asp:TextBox ID="tb_PassWord" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="注册" /></td>
</tr>
</table>
编写事件代码,双击按钮:
protected void Button1_Click(object sender, EventArgs e)
{
Maticsoft.BLL.Users bllUser;
Maticsoft.Model.Users modelUser;
bllUser = new Maticsoft.BLL.Users();
modelUser = new Maticsoft.Model.Users();
modelUser.UserName = tb_UserName.Text;
modelUser.TrueName = tb_TrueName.Text;
modelUser.PassWord = tb_PassWord.Text;
bllUser.Add(modelUser);
ClientScript.RegisterStartupScript(GetType(), "message", "<script language='javascript' defer>alert('注册成功!');</script>");
}
运行效果:
十三、 添加一个ProductView.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个产品浏览页面如下图所示:
分别添加一个GridView控件和ObjectDataSource控件
标签代码如下:
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
DataSourceID="ObjectDataSource1" AutoGenerateColumns="False" PageSize="2">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="产品名称" />
<asp:BoundField DataField="Price" HeaderText="价格" />
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("PciURL") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Image ID="Image1" runat="server" Height="139px" ImageUrl='<%# Eval("PciURL") %>'
Width="128px" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# "Buy.aspx?ProductID="+Eval("ProductID").ToString() %>'
Text="购买"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAllList"
TypeName="Maticsoft.BLL.Prodcuts"></asp:ObjectDataSource>
运行效果:
十四、 扩充订单视图的查询语句,因为视图部分代码没有自动生成。
打开项目“DAL”里面的“Orders.cs”文件,添加一个方法,代码如下:
/// <summary>
/// 获得视图数据列表
/// </summary>
public DataSet GetViewList(string strWhere)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select * ");
strSql.Append(" FROM OrderView ");
if (strWhere.Trim() != "")
{
strSql.Append(" where " + strWhere);
}
return DbHelperSQL.Query(strSql.ToString());
}
一般在显示数据表的时候,如果需要多表查询的,在数据库中建立好视图,然后自己扩充一下查询语句。
十五、 扩充逻辑层的订单处理逻辑。
打开项目“BLL”里面的“Orders.cs”文件,添加一个方法,代码如下:
/// <summary>
/// 获得视图数据列表
/// </summary>
public DataSet GetAllViewList()
{
return dal.GetViewList("");
}
十六、 添加一个OrderView.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个订单查看页面如下图所示:
分别添加一个GridView控件和ObjectDataSource控件
标签代码如下:
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1">
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAllViewList" TypeName="Maticsoft.BLL.Orders"></asp:ObjectDataSource>
运行效果:
十七、 接下来,添加后台产品管理功能。在Admin文件夹中,添加一个AdminProduct.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个订单查看页面如下图所示:
标签代码如下:
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSource1">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="产品名称" SortExpression="ProductName" />
<asp:BoundField DataField="Price" HeaderText="价格" SortExpression="Price" />
<asp:TemplateField HeaderText="操作">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server"
PostBackUrl='<%# "EditProduct.aspx?ProductID="+Eval("ProductID").ToString() %>'>修改</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CommandArgument='<%# Eval("ProductID").ToString() %>'
OnCommand="LinkButton2_Command" OnClientClick='return confirm("是否删除?");'>删除</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetAllList"
TypeName="Maticsoft.BLL.Prodcuts"></asp:ObjectDataSource>
编写删除代码:
protected void LinkButton2_Command(object sender, CommandEventArgs e)
{
Maticsoft.BLL.Prodcuts bllProduct = new Maticsoft.BLL.Prodcuts();
//通过CommandArgument获取产品编号,并删除
bllProduct.Delete(int.Parse(e.CommandArgument.ToString()));
//刷新数据
this.GridView1.DataBind();
}
运行效果:
十八、 在Admin文件夹中,添加一个AddProduct.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个订单查看页面如下图所示:
标签代码如下:
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="width: 100px">
产品名称:</td>
<td style="width: 100px">
<asp:TextBox ID="tb_ProductName" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 100px; height: 19px">
产品价格:</td>
<td style="width: 100px; height: 19px">
<asp:TextBox ID="tb_Price" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 100px">
上传图片:</td>
<td style="width: 100px">
<asp:FileUpload ID="FileUpload1" runat="server" /></td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="Button1" runat="server" Text="添加" /></td>
</tr>
</table>
编写添加按钮的事件代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
//先上传文件
string filepath = "";
string filename = "";
string serverpath = "";
try
{
if (FileUpload1.PostedFile.FileName.Trim() != "")
{
filepath = FileUpload1.PostedFile.FileName;
filename = filepath.Substring(filepath.LastIndexOf("//")+1);
serverpath = Server.MapPath("~/Images/") + filename;
FileUpload1.PostedFile.SaveAs(serverpath);
}
}
catch (Exception ex)
{
}
//保存记录
Maticsoft.BLL.Prodcuts bllProduct = new Maticsoft.BLL.Prodcuts();
Maticsoft.Model.Prodcuts modelProduct = new Maticsoft.Model.Prodcuts();
modelProduct.ProductName = tb_ProductName.Text;
modelProduct.Price = decimal.Parse(tb_Price.Text);
modelProduct.PciURL = "~/Images/" + filename;
bllProduct.Add(modelProduct);
ClientScript.RegisterStartupScript(GetType(), "message", "<script language='javascript' defer>alert('添加成功!');</script>");
}
十九、 在Admin文件夹中,添加一个EditProduct.aspx 的“WEB 内容表单”,选择母版页“MasterPage”,设计一个订单查看页面如下图所示:
标签代码如下:
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="width: 100px">
产品名称:</td>
<td style="width: 100px">
<asp:TextBox ID="tb_ProductName" runat="server"></asp:TextBox>
<asp:HiddenField ID="hf_ProductID" runat="server" />
</td>
</tr>
<tr>
<td style="width: 100px; height: 19px">
产品价格:</td>
<td style="width: 100px; height: 19px">
<asp:TextBox ID="tb_Price" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 100px">
上传图片:</td>
<td style="width: 100px">
<asp:FileUpload ID="FileUpload1" runat="server" /></td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="Button1" runat="server" Text="保存" /></td>
</tr>
</table>
编写代码:
protected void Page_Load(object sender, EventArgs e)
{
//获取产品编号,并查询产品的信息
string ProductID = Request["ProductID"].ToString();
hf_ProductID.Value = ProductID;
Maticsoft.BLL.Prodcuts bllProduct = new Maticsoft.BLL.Prodcuts();
Maticsoft.Model.Prodcuts modelProdcut = new Maticsoft.Model.Prodcuts();
modelProdcut = bllProduct.GetModel(int.Parse(ProductID));
tb_ProductName.Text = modelProdcut.ProductName;
tb_Price.Text = modelProdcut.Price.ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
//先上传文件
string filepath = "";
string filename = "";
string serverpath = "";
try
{
if (FileUpload1.PostedFile.FileName.Trim() != "")
{
filepath = FileUpload1.PostedFile.FileName;
filename = filepath.Substring(filepath.LastIndexOf("//") + 1);
serverpath = Server.MapPath("~/Images/") + filename;
FileUpload1.PostedFile.SaveAs(serverpath);
}
}
catch (Exception ex)
{
}
//保存记录
Maticsoft.BLL.Prodcuts bllProduct = new Maticsoft.BLL.Prodcuts();
Maticsoft.Model.Prodcuts modelProduct = new Maticsoft.Model.Prodcuts();
modelProduct.ProductName = tb_ProductName.Text;
modelProduct.Price = decimal.Parse(tb_Price.Text);
//这里没有考虑无重新上传图片的情况,同学们可以自己添加代码实现
modelProduct.PciURL = "~/Images/" + filename;
modelProduct.ProductID = int.Parse(hf_ProductID.Value);
bllProduct.Update(modelProduct);
ClientScript.RegisterStartupScript(GetType(), "message", "<script language='javascript' defer>alert('修改成功!');</script>");
}
二十、