若天明 发表于 2015-1-16 22:30:02

ASP网页设计开辟BtoC电子商务体系(ASP.NET)

ActiveServerPage技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段,极大地提高了开发的效果。在讨论ASP的安全性问题之前,让我们来看看ASP是怎么工作的。原文另有两个图
在对ASP.NETWeb表单的编程模子有了基础的熟悉后,经由过程使用于实际的开辟案例来进步对ASP.NETWeb表单内涵运作机制的懂得,和由此带来的对体系架构的掌控是很有需要的。我们没无为编程而编程的尊贵姿势,我们深深明白可以开辟出高效,强健,壮大的使用程序一直是编程的最终。我们上面经由过程一个完全的BToC电子商务体系的开辟流程来展现ASP.NETWeb表单是如何详细搭建面向下一代收集平台的。
这是一个典范的基于B/S(扫瞄器/服务器)三层架构的食物,饮料电子商务批发体系――“玉米地零食店”。前端为产物扫瞄器,为消耗者供应扫瞄/选购商品,下定单购物等各个环节的功效;两头层为发卖商的税率,优惠等商务逻辑;后端为与全部批发体系相干的产物,主顾,定单等数据库。我们接纳ASP.NET+IIS5来构建前端和两头层,SQLServer2000来办理后端数据库,全部体系运转于WindowsXP。相干硬件设置只需满意上述软件的基础设置,体系功能即可包管。上面为该网上批发体系的前端界面图示:

在体例Web表单贸易前端和两头层之前,我们有需要对后端数据库做一个复杂的先容。后端数据库CornfieldGrocer由4个表构成:产物种别表Categories,产物细节表Details,产物表Products,客户信息表Customers。思索到演示体系的的简便性,我们没有增加相干的存储历程,视图,划定规矩等,这些在实践的体系的开辟中对进步体系的功能是很有需要,特别是在年夜数据量的情形下。上面为4个表的字段的图示先容:

各个表的字段的表义已相称分明,我们不在这里赘述。我们上面向人人展现一下全部电子商务批发体系――“玉米地零食店”的物理文件构成及其布局,下图为表示图:

一切的文件位于ASP.NET站点目次CornfieldGrocer下,个中另有Web表单页面用到的图电影目次Images下的文件就不再在这里列出了。
上面我们入手下手编写前端和两头层代码,为了更分明地展现WebFormASP.NET的底层代码机关,我们接纳记事原本完成全部代码的编写历程。必要申明的是在真实的工程项目开辟理论中,如能借助VisualStudio.Net等可视集成开辟工具,开辟效力会年夜年夜进步。但在ASP.NET代码的底层机制没有谙习的情形下,笔者激烈倡议早期的开辟进修无妨放在Windows体系自带的“记事本”这一复杂却可以把代码表露得相称明晰的工具里。
因为篇幅无限,我们不成能将一切的代码都在这里展现给人人。如前所述,web.config为每一个站点级的基于XML的设置文件,卖力一些ASP.NET的平安认证,编码选择,诊断测试等ASP.NET的设置事情,为扫瞄器哀求ASP.NETWeb表单时经由过程IIS处置后的第一站。上面为其内容:

<configuration>
<system.web>
<globalizationrequestEncoding="UTF-8"responseEncoding="UTF-8"/>
</system.web>
</configuration>


简单看到这里的设置内容相称复杂,仅指定哀求/发送的编码为“UTF-8”。我们对此不再赘述。
global.asax文件及其由后端代码文件global.asax.cs编译成的BinCornfieldGrocer.dll配合构成该网上批发体系的ASP.NET使用程序界说。我们先来看文件global.asax:

<%@ApplicationInherits="CornfieldGrocer.Global"%>

该文件只要一行唆使符,它暗示ASP.NET使用程序的界说承继自Global类,而Global类恰是在global.asax.cs文件中界说:

usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Web;
usingSystem.Web.SessionState;

namespaceCornfieldGrocer
{
publicclassGlobal:System.Web.HttpApplication
{
protectedvoidSession_Start(Objectsender,EventArgse)
{
if(Session["ShoppingCart"]==null)
{
Session["ShoppingCart"]=newCornfieldGrocer.OrderList();
}
}
}
}

在Global类里,我们界说了区段(Session)意义下的购物卡(ShoppingCart)――这里接纳了C#中的索引器。购物卡的范例为CornfieldGrocer定名空间中的OrderList类,在CornfieldGrocer.cs文件中有界说。我们固然也能够在global.asax文件顶用剧本言语的情势将下面两个文件的内容兼并起来,但那不是ASP.NET保举的做法,由于剧本言语的第一次实行还要举行静态编译,这回丧失一部分功能,而将CS文件提早编译成dll文件则会下降这类价值――固然这里的编译的意义仍是指将CS的源代码文件编译成微软两头言语的历程。其次,页面与后端代码分别的准绳易于项目办理,是VisualStudio.NET保举的工程性的做法。
文件Default.aspx为全部网上批发体系的前端页面HTML代码,Default.aspx.cs为厥后端把持Web表单举动的CS代码。因为篇幅干系我们这里不再赘述其HTML代码,实践上夙昔面给出的前端界面图示,我们能够基础懂得Default.aspx的HTML代码布局。Style.css文件为Default.aspx文件的页面款式界说文件,界说一些页面元素的色彩,格局,间距等润色性的器材,我们也不再多言。上面只向人人展现Default.aspx的页面唆使符:

<%@AutoEventWireup="false"Inherits="CornfieldGrocer.MainForm"%>

我们用“Inherits="CornfieldGrocer.MainForm"”来暗示我们的页面承继自MainForm类,如许我们就完成了对ASP.NETWeb表单举动的把持代码与页面显现的HTML的分别。个中“AutoEventWireup="false"”暗示页面事务非主动使能――页面事务非主动使能的意义是一切页面事务必需经由用户明白的操纵才干触发,因为该属性缺省为“true”暗示主动使能,但我们的贸易逻辑请求非主动使能,故这里的语句很有需要,不然会引发体系处置的凌乱。上面我们来看MainForm类:

usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HtmlControls;

namespaceCornfieldGrocer
{
publicclassMainForm:System.Web.UI.Page
{
protectedSystem.Web.UI.WebControls.LabelCurrentCategory;
protectedSystem.Web.UI.WebControls.LabelName;
protectedSystem.Web.UI.WebControls.LabelSubTotal;
protectedSystem.Web.UI.WebControls.ImageButtonImagebutton1;
protectedSystem.Web.UI.WebControls.LabelDescription;
protectedSystem.Web.UI.WebControls.LabelCompany;
protectedSystem.Web.UI.WebControls.RepeaterDetailsListing;
protectedSystem.Web.UI.WebControls.DataListProductListing;
protectedSystem.Web.UI.WebControls.DataListShoppingCartList;
protectedSystem.Web.UI.HtmlControls.HtmlSelectCategoryList;
protectedSystem.Web.UI.WebControls.ButtonbtnSelect;
protectedSystem.Web.UI.WebControls.LabelTax;
protectedSystem.Web.UI.WebControls.LabelTotal;
protectedSystem.Web.UI.WebControls.ImageButtonImagebutton4;
protectedSystem.Web.UI.WebControls.ImageButtonImagebutton5;
protectedSystem.Web.UI.WebControls.ImageButtonImagebutton6;
protectedSystem.Web.UI.HtmlControls.HtmlInputTextQty;
protectedSystem.Web.UI.HtmlControls.HtmlGenericControlCheckoutPanel;
protectedSystem.Web.UI.HtmlControls.HtmlImageSelectedProdPicture;

publicMainForm()
{
Page.Init+=newSystem.EventHandler(Page_Init);
}
privatevoidPage_Load(objectsender,System.EventArgse)
{
if(!IsPostBack)
{
ProductListing.SelectedIndex=0;

UpdateProducts();
UpdateShoppingCart();
}
}
privatevoidPage_Init(objectsender,EventArgse)
{
InitializeComponent();
}
privatevoidInitializeComponent()
{
this.btnSelect.Click+=
newSystem.EventHandler(this.CategoryList_Select);
this.ProductListing.SelectedIndexChanged+=
newSystem.EventHandler(this.ProductListing_Select);
this.Imagebutton1.Click+=
newImageClickEventHandler(this.AddBtn_Click);
this.Imagebutton4.Click+=
newImageClickEventHandler(this.Recalculate_Click);
this.Imagebutton6.Click+=
newImageClickEventHandler(this.ClearCart_Click);
this.Load+=
newSystem.EventHandler(this.Page_Load);
}
privatevoidCategoryList_Select(Objectsender,EventArgse)
{
CurrentCategory.Text=
CategoryList.Items.Text;
UpdateProducts();
}
privatevoidProductListing_Select(Objectsender,EventArgse)
{
UpdateProducts();
}
privatevoidAddBtn_Click(Objectsender,ImageClickEventArgse)
{
intproductID=Int32.Parse
(ProductListing.DataKeys.ToString());

InventoryDBmarket=newInventoryDB();
DataRowproduct=market.GetProduct(productID);

CornfieldGrocer.OrderListshoppingCart=
((CornfieldGrocer.OrderList)Session["ShoppingCart"]);

shoppingCart.Add(newCornfieldGrocer.OrderItem(productID,
(String)product["ProductName"],
Double.Parse(product["UnitPrice"].ToString()),1));

UpdateShoppingCart();
}
privatevoidRecalculate_Click(Objectsender,ImageClickEventArgse)
{
CornfieldGrocer.OrderListshoppingCart=
((CornfieldGrocer.OrderList)Session["ShoppingCart"]);

for(inti=0;i<ShoppingCartList.Items.Count;i++)>
{
HtmlInputTextqty=
(HtmlInputText)ShoppingCartList.Items.FindControl("Qty");
try
{
shoppingCart[(String)ShoppingCartList.DataKeys]].Quantity
=Int32.Parse(qty.Value);
}
catch(Exception)
{
}
}
UpdateShoppingCart();
}
privatevoidClearCart_Click(Objectsender,ImageClickEventArgse)
{
CornfieldGrocer.OrderListshoppingCart=
((CornfieldGrocer.OrderList)Session["ShoppingCart"]);

shoppingCart.ClearCart();
UpdateShoppingCart();
}
voidUpdateProducts()
{
InventoryDBmarket=newInventoryDB();

intcategoryID=Int32.Parse
(CategoryList.Items.Value);
ProductListing.DataSource=
market.GetProducts(categoryID).DefaultView;
ProductListing.DataBind();

intproductID=Int32.Parse
(ProductListing.DataKeys.ToString());
DataRowproduct=market.GetProduct(productID);

Name.Text=product["ProductName"].ToString();
SelectedProdPicture.Src=product["ImagePath"].ToString();
Description.Text=product["ProductDescription"].ToString();
Company.Text=product["Manufacturer"].ToString();

DetailsListing.DataSource=
market.GetProductCalories(productID).DefaultView;
DetailsListing.DataBind();
}
voidUpdateShoppingCart()
{
CornfieldGrocer.OrderListshoppingCart=
((CornfieldGrocer.OrderList)Session["ShoppingCart"]);

SubTotal.Text=String.Format("{0:C}",shoppingCart.SubTotal);
Tax.Text=String.Format("{0:C}",shoppingCart.Tax);
Total.Text=String.Format("{0:C}",shoppingCart.Total);

ShoppingCartList.DataSource=shoppingCart.Values;
ShoppingCartList.DataBind();
}
}
}
MainForm类中共有11个办法,19个回护域。个中的19个回护域和后面给出的前端界面图示的页面元素绝对应,这里不再赘述。11个办法中MainForm()为构建器,其增加了页面初始化事务Page_Init(),这是ASP.NETWeb表单开始处置的事务,一样平常举行一些基本的初始化操纵。我们能够看到在Page_Init()中举行了初始化组件InitializeComponent()的操纵。Page_Load()事务呈现在用户收回哀求后,页面装载的时分,在这里一样平常可做一些贸易逻辑初始化方面的操纵,好比数据库的毗连,购物卡的初始化等。我们这里举行了产物展现UpdateProducts()和购物卡的初始化UpdateShoppingCart()的操纵。
其他四个办法分离为产物种别的选择ProductListing_Select(),购置产物的增加AddBtn_Click(),购物卡的从头盘算Recalculate_Click(),购物卡的扫除ClearCart_Click()都是经由过程对ASP.NET控件的操纵来触发响应的事务完成贸易逻辑。下面的代码已展现的相称分明,我们不再赘述。
最初我们要向人人申明的是两头层商务逻辑的组件。它由三个类组成:库存数据类InventoryDB,定单项目类OrderItem和定单列表类OrderList。它们配合在文件CornfieldGrocer.cs文件中界说。自注释的编程体例已它们的布局展现的相称扫除,我们上面只给出该文件的CS源代码:

usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Collections;

namespaceCornfieldGrocer
{
publicclassInventoryDB
{
publicDataTableGetProducts(intcategoryID)
{
SqlConnectionsqlConnect=newSqlConnection
("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");
SqlDataAdaptersqlAdapter1=newSqlDataAdapter
("Select*fromProductswherecategoryid="+categoryID,sqlConnect);
DataSetproducts=newDataSet();
sqlAdapter1.Fill(products,"products");
returnproducts.Tables;
}
publicDataRowGetProduct(intproductID)
{
SqlConnectionsqlConnect=newSqlConnection
("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");
SqlDataAdaptersqlAdapter1=newSqlDataAdapter
("Select*fromProductswhereproductID="+productID,sqlConnect);
DataSetproduct=newDataSet();
sqlAdapter1.Fill(product,"product");
returnproduct.Tables.Rows;
}
publicDataTableGetProductCalories(intproductID)
{
SqlConnectionsqlConnect=newSqlConnection
("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");
SqlDataAdaptersqlAdapter1=newSqlDataAdapter
("Select*fromDetailswhereproductID="+productID,sqlConnect);
DataSetdetails=newDataSet();
sqlAdapter1.Fill(details,"details");
returndetails.Tables;
}
}

publicclassOrderItem
{
publicintproductID;
publicintquantity;
publicStringname;
publicdoubleprice;
publicOrderItem(intproductID,Stringname,doubleprice,intquantity)
{
this.productID=productID;
this.quantity=quantity;
this.name=name;
this.price=price;
}
publicintProductID
{
get{returnProductID;}
}
publicintQuantity
{
get{returnquantity;}
set{quantity=value;}
}
publicStringName
{
get{returnname;}
}
publicdoublePrice
{
get{returnprice;}
}
publicdoubleTotal
{
get{returnquantity*price;}
}
}

publicclassOrderList
{
privateHashtableorders=newHashtable();
privatedoubletaxRate=0.08;
publicdoubleSubTotal
{
get
{
if(orders.Count==0)
return0.0;
doublesubTotal=0;
IEnumeratoritems=orders.Values.GetEnumerator();
while(items.MoveNext())
{
subTotal+=((OrderItem)items.Current).Price*
((OrderItem)items.Current).Quantity;
}
returnsubTotal;
}
}
publicdoubleTaxRate
{
get{returntaxRate;}
set{taxRate=value;}
}
publicdoubleTax
{
get{returnSubTotal*taxRate;}
}
publicdoubleTotal
{
get{returnSubTotal*(1+taxRate);}
}
publicICollectionValues{
get{
returnorders.Values;
}
}
publicOrderItemthis{
get{
return(OrderItem)orders;
}
}
publicvoidAdd(OrderItemvalue)
{
if(orders==null){
orders.Add(value.Name,value);
}
else
{
OrderItemoI=(OrderItem)orders;
oI.Quantity=oI.Quantity+1;
}
}
publicvoidClearCart(){
orders.Clear();
}
}
}

必要申明的是我们将三个文件CornfieldGrocer.cs,Default.aspx.cs,Global.asax.cs用编译命令“csc/t:library/out:CornfieldGrocer.dllcornfieldgrocer.csdefault.aspx.csglobal.asax.cs”将它们全体封装在CornfieldGrocer定名空间里,固然这并非必需的。下面的编译器输入CornfieldGrocer.dll文件,我们设置该网上批发站点时只需将该文件拷贝到站点根目次中的Bin目次下便可。
到此为止,我们已完全的向人人展现了使用ASP.NETWeb表单创建一个小型的网上买卖体系的编码,设置等事情。固然作为演示案例,它还没有真正体系的完美的功能,平安,界面等各个方面的优化思索和计划。但它向我们展现的ASP.NETWeb表单模子却十分典范且底层,人人不防在此基本上经由过程不休的修正和扩大来开辟合适本人的买卖体系。好比关于Default.aspx文件中AutoEventWireup="false"假如设置为“true”或往失落这个语句,在运转页面时会呈现甚么情形?经由过程这些实习便会不休的加深我们对ASP.NET底层的熟悉,最初到达熟能生巧的掌控。实践上手艺的进修,特别是编程,除必定的乐趣和悟性外,大批代码实例的熬炼也是很有需要的,这自己就是笔者发展的一个历程,也是本文中笔者勉力要给人人展现的。
使用filesystemobject,可以对服务器上的文件进行操作,浏览、复制、移动、删除等。有ado的支持,asp对数据库的操作非常得心应手。你甚至可以像使用本地数据库那样,管理远程主机上的数据库,对表格、记录进行各种操作。

仓酷云 发表于 2015-1-19 15:21:28

以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。

若相依 发表于 2015-1-27 16:05:49

兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的

第二个灵魂 发表于 2015-2-5 10:16:05

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

若天明 发表于 2015-2-11 09:23:46

封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。

变相怪杰 发表于 2015-3-2 08:35:57

在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。

飘灵儿 发表于 2015-3-11 03:06:33

Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write

爱飞 发表于 2015-3-17 19:24:00

我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。

柔情似水 发表于 2015-3-24 21:54:30

Session:这个存储跟客户端会话过程的数据,默认20分钟失效
页: [1]
查看完整版本: ASP网页设计开辟BtoC电子商务体系(ASP.NET)