日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

[*转*] 开发B2C电子商务系统(ASP.NET)--多年前的老文章

發(fā)布時(shí)間:2025/3/15 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [*转*] 开发B2C电子商务系统(ASP.NET)--多年前的老文章 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開(kāi)發(fā)BtoC電子商務(wù)系統(tǒng)(ASP.NET)

??? 原文還有兩個(gè)圖
??? 在對(duì)ASP.NET Web表單的編程模型有了基本的認(rèn)識(shí)后,通過(guò)應(yīng)用于現(xiàn)實(shí)的開(kāi)發(fā)案例來(lái)提高對(duì)ASP.NET Web表單內(nèi)在運(yùn)作機(jī)制的了解,以及由此帶來(lái)的對(duì)系統(tǒng)架構(gòu)的掌控是很有必要的。
??? 我們沒(méi)有為編程而編程的高貴姿態(tài),我們深深懂得能夠開(kāi)發(fā)出高效,健壯,強(qiáng)大的應(yīng)用程序始終是編程的終極。

??? 下面通過(guò)一個(gè)完整的BToC電子商務(wù)系統(tǒng)的開(kāi)發(fā)流程來(lái)展示ASP.NET Web表單是怎樣具體搭建面向下一代網(wǎng)絡(luò)平臺(tái)的。
??? 這是一個(gè)典型的基于B/S(瀏覽器/服務(wù)器) 三層架構(gòu)的食品,飲料電子商務(wù)零售系統(tǒng)——“玉米地零食店”。
① 前端為產(chǎn)品瀏覽器,為消費(fèi)者提供瀏覽/選購(gòu)商品,下訂單購(gòu)物等各個(gè)環(huán)節(jié)的功能;
② 中間層為銷(xiāo)售商的稅率,優(yōu)惠等商務(wù)邏輯;
③ 后端為與整個(gè)零售系統(tǒng)相關(guān)的產(chǎn)品,顧客,訂單等數(shù)據(jù)庫(kù)。

  采用ASP.NET+IIS 5來(lái)構(gòu)建前端和中間層,SQL Server 2000來(lái)管理后端數(shù)據(jù)庫(kù),整個(gè)系統(tǒng)運(yùn)行于Windows XP。
  相關(guān)硬件配置只要滿足上述軟件的基本配置,系統(tǒng)性能便可保證。

  下面為該網(wǎng)上零售系統(tǒng)的前端界面圖示:
  在編制Web 表單商業(yè)前端和中間層之前,我們有必要對(duì)后端數(shù)據(jù)庫(kù)做一個(gè)簡(jiǎn)單的介紹。
  后端數(shù)據(jù)庫(kù) CornfieldGrocer 由4個(gè)表組成:
① 產(chǎn)品類(lèi)別表Categories ,
② 產(chǎn)品細(xì)節(jié)表 Details ,
③ 產(chǎn)品表 Products ,
④ 客戶信息表Customers。

  考慮到演示系統(tǒng)的的簡(jiǎn)潔性,我們沒(méi)有添加相關(guān)的存儲(chǔ)過(guò)程,視圖,規(guī)則等,這些在實(shí)際的系統(tǒng)的開(kāi)發(fā)中對(duì)提高系統(tǒng)的性能是很有必要,尤其是在大數(shù)據(jù)量的情況下。
  下面為4個(gè)表的字段的圖示介紹:
  各個(gè)表的字段的表義已經(jīng)相當(dāng)清楚,我們不在這里贅述。

  下面向大家展示一下整個(gè)電子商務(wù)零售系統(tǒng)——“玉米地零食店”的物理文件組成及其結(jié)構(gòu),下圖為示意圖:
  所有的文件位于ASP.NET站點(diǎn)目錄CornfieldGrocer下,其中還有Web表單頁(yè)面用到的圖片子目錄Images下的文件就不再在這里列出了。
  開(kāi)始編寫(xiě)前端和中間層代碼,為了更清楚地展示W(wǎng)eb Form ASP.NET的底層代碼構(gòu)造,采用記事本來(lái)完成整個(gè)代碼的編寫(xiě)過(guò)程。
  需要說(shuō)明的是在真正的工程項(xiàng)目開(kāi)發(fā)實(shí)踐中,如能借助Visual Studio.Net等可視集成開(kāi)發(fā)工具,開(kāi)發(fā)效率會(huì)大大提高。
  但在ASP.NET代碼的底層機(jī)制沒(méi)有諳熟的情況下,筆者強(qiáng)烈建議初期的開(kāi)發(fā)學(xué)習(xí)不妨放在Windows系統(tǒng)自帶的“記事本”這一簡(jiǎn)單卻能夠把代碼暴露得相當(dāng)清晰的工具里。 由于篇幅有限,我們不可能將所有的代碼都在這里展示給大家。

  如前所述,web.config為每個(gè)站點(diǎn)級(jí)的基于XML的配置文件,負(fù)責(zé)一些ASP.NET的安全認(rèn)證,編碼選擇,診斷測(cè)試等ASP.NET的配置工作,為瀏覽器請(qǐng)求ASP.NET Web表單時(shí)通過(guò) IIS處理后的第一站。
下面為其內(nèi)容:

<configuration>?
<system.web>?
<globalization?requestEncoding="UTF-8"?responseEncoding="UTF-8"?/>?
</system.web>?
</configuration>?

  容易看到這里的配置內(nèi)容相當(dāng)簡(jiǎn)單,僅指定請(qǐng)求/發(fā)送的編碼為“UTF-8”。我們對(duì)此不再贅述。

  global.asax文件及其由后端代碼文件global.asax.cs編譯成的Bin\CornfieldGrocer.dll共同組成該網(wǎng)上零售系統(tǒng)的ASP.NET應(yīng)用程序定義。
  先來(lái)看文件global.asax
  <%@ Application Inherits="CornfieldGrocer.Global" %>
  該文件只有一行指示符,它表示ASP.NET應(yīng)用程序的定義繼承自Global類(lèi),而Global類(lèi)正是在global.asax.cs文件中定義:

using?System;?
using?System.Collections;?
using?System.ComponentModel;?
using?System.Web;?
using?System.Web.SessionState;?

namespace?CornfieldGrocer?
{?
????
public?class?Global?:?System.Web.HttpApplication?
????
{?
????????
protected?void?Session_Start(Object?sender,?EventArgs?e)?
????????
{?
????????????
if?(Session["ShoppingCart"]?==?null)?
????????????
{?
????????????????Session[
"ShoppingCart"]?=?new?CornfieldGrocer.OrderList();?
????????????}
?
????????}
?
????}
?
}
?

  在Global類(lèi)里,我們定義了區(qū)段(Session)意義下的購(gòu)物卡(ShoppingCart)——這里采用了C#中的索引器。

  購(gòu)物卡的類(lèi)型為CornfieldGrocer命名空間中的OrderList類(lèi),在CornfieldGrocer.cs文件中有定義。當(dāng)然也可以在global.asax文件中用腳本語(yǔ)言的形式將上面兩個(gè)文件的內(nèi)容合并起來(lái),但那不是ASP.NET推薦的做法,因?yàn)槟_本語(yǔ)言的第一次執(zhí)行還要進(jìn)行動(dòng)態(tài)編譯,這回?fù)p失一部分性能,而將CS文件提前編譯成dll文件則會(huì)降低這種代價(jià)——當(dāng)然這里的編譯的意思還是指將CS的源代碼文件編譯成微軟中間語(yǔ)言的過(guò)程。
  其次,頁(yè)面與后端代碼分離的原則易于項(xiàng)目管理,是Visual Studio.NET推薦的工程性的做法。 文件Default.aspx為整個(gè)網(wǎng)上零售系統(tǒng)的前端頁(yè)面HTML代碼,Default.aspx.cs為其后端控制Web表單行為的CS代碼。

  由于篇幅關(guān)系我們這里不再贅述其HTML代碼,實(shí)際上從前面給出的前端界面圖示,我們可以基本了解Default.aspx的HTML代碼結(jié)構(gòu)。Style.css文件為Default.aspx文件的頁(yè)面樣式定義文件,定義一些頁(yè)面元素的顏色,格式,間距等修飾性的東西,我們也不再多言。
下面只向大家展示Default.aspx的頁(yè)面指示符:
<%@ AutoEventWireup="false" Inherits="CornfieldGrocer.MainForm" %>
用“Inherits="CornfieldGrocer.MainForm"”來(lái)表示頁(yè)面繼承自MainForm類(lèi),這樣就實(shí)現(xiàn)了對(duì)ASP.NET Web 表單行為的控制代碼與頁(yè)面顯示的HTML的分離。
其中“AutoEventWireup="false"”表示頁(yè)面事件非自動(dòng)使能——頁(yè)面事件非自動(dòng)使能的意思是所有頁(yè)面事件必須經(jīng)過(guò)用戶明確的操作才能觸發(fā),
由于該屬性缺省為“true”表示自動(dòng)使能,但商業(yè)邏輯要求非自動(dòng)使能,故這里的語(yǔ)句很有必要,否則會(huì)引起系統(tǒng)處理的混亂。
  下面我們來(lái)看MainForm類(lèi):

using?System;?
using?System.Collections;?
using?System.ComponentModel;?
using?System.Data;?
using?System.Drawing;?
using?System.Web;?
using?System.Web.SessionState;?
using?System.Web.UI;?
using?System.Web.UI.WebControls;?
using?System.Web.UI.HtmlControls;?

namespace?CornfieldGrocer?
{?
????
public?class?MainForm:?System.Web.UI.Page?
????
{?
????????
protected?System.Web.UI.WebControls.Label?CurrentCategory;?
????????
protected?System.Web.UI.WebControls.Label?Name;?
????????
protected?System.Web.UI.WebControls.Label?SubTotal;?
????????
protected?System.Web.UI.WebControls.ImageButton?Imagebutton1;?
????????
protected?System.Web.UI.WebControls.Label?Description;?
????????
protected?System.Web.UI.WebControls.Label?Company;?
????????
protected?System.Web.UI.WebControls.Repeater?DetailsListing;?
????????
protected?System.Web.UI.WebControls.DataList?ProductListing;?
????????
protected?System.Web.UI.WebControls.DataList?ShoppingCartList;?
????????
protected?System.Web.UI.HtmlControls.HtmlSelect?CategoryList;?
????????
protected?System.Web.UI.WebControls.Button?btnSelect;?
????????
protected?System.Web.UI.WebControls.Label?Tax;?
????????
protected?System.Web.UI.WebControls.Label?Total;?
????????
protected?System.Web.UI.WebControls.ImageButton?Imagebutton4;?
????????
protected?System.Web.UI.WebControls.ImageButton?Imagebutton5;?
????????
protected?System.Web.UI.WebControls.ImageButton?Imagebutton6;?
????????
protected?System.Web.UI.HtmlControls.HtmlInputText?Qty;?
????????
protected?System.Web.UI.HtmlControls.HtmlGenericControl?CheckoutPanel;?
????????
protected?System.Web.UI.HtmlControls.HtmlImage?SelectedProdPicture;?

????????
public?MainForm()?
????????
{?
????????????Page.Init?
+=?new?System.EventHandler(Page_Init);?
????????}
?
????????
????????
private?void?Page_Load(object?sender,?System.EventArgs?e)?
????????
{?
????????????
if?(!IsPostBack)?
????????????
{?
????????????????ProductListing.SelectedIndex?
=?0;?
????????????????UpdateProducts();?
????????????????UpdateShoppingCart();?
????????????}

????????}
?
????????
????????
private?void?Page_Init(object?sender,?EventArgs?e)?
????????
{?
????????????InitializeComponent();?
????????}
?
????????
????????
private?void?InitializeComponent()?
????????
{?
????????????
this.btnSelect.Click?+=?new?System.EventHandler(this.CategoryList_Select);?
????????????
this.ProductListing.SelectedIndexChanged?+=?new?System.EventHandler(this.ProductListing_Select);?
????????????
this.Imagebutton1.Click?+=?new?ImageClickEventHandler(this.AddBtn_Click);?
????????????
this.Imagebutton4.Click?+=?new?ImageClickEventHandler(this.Recalculate_Click);?
????????????
this.Imagebutton6.Click?+=?new?ImageClickEventHandler(this.ClearCart_Click);?
????????????
this.Load?+=?new?System.EventHandler(this.Page_Load);?
????????}
?
????????
????????
private?void?CategoryList_Select(Object?sender,?EventArgs?e)?
????????
{?
????????????CurrentCategory.Text?
=?
????????????CategoryList.Items[CategoryList.SelectedIndex].Text;?
????????????UpdateProducts();?
????????}
?
????????
????????
private?void?ProductListing_Select(Object?sender,?EventArgs?e)?
????????
{?
????????????UpdateProducts();?
????????}
?
????????
????????
private?void?AddBtn_Click(Object?sender,?ImageClickEventArgs?e)?
????????
{?
????????????
int?productID?=?Int32.Parse(ProductListing.DataKeys[ProductListing.SelectedIndex].ToString());?
????????????InventoryDB?market?
=?new?InventoryDB();?
????????????DataRow?product?
=?market.GetProduct(productID);?

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

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

????????????UpdateShoppingCart();?
????????}
?
????????
????????
private?void?Recalculate_Click(Object?sender,?ImageClickEventArgs?e)?
????????
{?
????????????CornfieldGrocer.OrderList?shoppingCart?
=?((CornfieldGrocer.OrderList)?Session["ShoppingCart"]);?

????????????
for?(int?i=0;?i<ShoppingCartList.Items.Count;?i++)?
????????????
{?
????????????????HtmlInputText?qty?
=?(HtmlInputText)?ShoppingCartList.Items[i].FindControl("Qty");?
????????????????
try?
????????????????
{?
????????????????????shoppingCart[(String)?ShoppingCartList.DataKeys][i]].Quantity?
=?Int32.Parse(qty.Value);?
????????????????}
?
????????????????
catch?(Exception)?
????????????????
{?
????????????????}
?
????????????}
?
????????????UpdateShoppingCart();?
????????}
?
????????
????????
private?void?ClearCart_Click(Object?sender,?ImageClickEventArgs?e)?
????????
{?
????????????CornfieldGrocer.OrderList?shoppingCart?
=?((CornfieldGrocer.OrderList)?Session["ShoppingCart"]);?

????????????shoppingCart.ClearCart();?
????????????UpdateShoppingCart();?
????????}
?
????????
????????
void?UpdateProducts()?
????????
{?
????????????InventoryDB?market?
=?new?InventoryDB();?

????????????
int?categoryID?=?Int32.Parse(CategoryList.Items[CategoryList.SelectedIndex].Value);?
????????????ProductListing.DataSource?
=?market.GetProducts(categoryID).DefaultView;?
????????????ProductListing.DataBind();?

????????????
int?productID?=?Int32.Parse(ProductListing.DataKeys[ProductListing.SelectedIndex].ToString());?
????????????DataRow?product?
=?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();?
????????}
?
????????
????????
void?UpdateShoppingCart()?
????????
{?
????????????CornfieldGrocer.OrderList?shoppingCart?
=?((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類(lèi)中共有11個(gè)方法,19個(gè)保護(hù)域。其中的19個(gè)保護(hù)域和前面給出的前端界面圖示的頁(yè)面元素相對(duì)應(yīng),這里不再贅述。11個(gè)方法中MainForm()為構(gòu)建器,其添加了頁(yè)面初始化事件Page_Init(),這是ASP.NET Web表單最先處理的事件,一般進(jìn)行一些基礎(chǔ)的初始化操作。
  可以看到在Page_Init()中進(jìn)行了初始化組件InitializeComponent()的操作。
  Page_Load()事件出現(xiàn)在用戶發(fā)出請(qǐng)求后,頁(yè)面裝載的時(shí)候,在這里一般可做一些商業(yè)邏輯初始化方面的操作,比如數(shù)據(jù)庫(kù)的連接,購(gòu)物卡的初始化等。這里進(jìn)行了產(chǎn)品展示UpdateProducts()和購(gòu)物卡的初始化UpdateShoppingCart()的操作。
  其他四個(gè)方法分別為產(chǎn)品類(lèi)別的選擇ProductListing_Select(),購(gòu)買(mǎi)產(chǎn)品的添加AddBtn_Click(),購(gòu)物卡的重新計(jì)算Recalculate_Click(),購(gòu)物卡的清除ClearCart_Click()都是通過(guò)對(duì)ASP.NET控件的操作來(lái)觸發(fā)相應(yīng)的事件完成商業(yè)邏輯。
  上面的代碼已經(jīng)展示的相當(dāng)清楚,我們不再贅述。

  最后要向大家說(shuō)明的是中間層商務(wù)邏輯的組件。由三個(gè)類(lèi)構(gòu)成:庫(kù)存數(shù)據(jù)類(lèi)InventoryDB,訂單項(xiàng)目類(lèi)OrderItem和訂單列表類(lèi)OrderList。它們共同在文件CornfieldGrocer.cs文件中定義。自解釋的編程方式已經(jīng)它們的結(jié)構(gòu)展示的相當(dāng)清除,我們下面只給出該文件的CS源代碼:

using?System;?
using?System.Data;?
using?System.Data.SqlClient;?
using?System.Collections;?

namespace?CornfieldGrocer?
{?
????
public?class?InventoryDB?
????
{?
????????
public?DataTable?GetProducts(int?categoryID)?
????????
{?
????????????SqlConnection?sqlConnect
=?new?SqlConnection?("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");?
????????????SqlDataAdapter?sqlAdapter1?
=?new?SqlDataAdapter?("Select?*?from?Products?where?categoryid="+categoryID,sqlConnect);?
????????????DataSet?products?
=?new?DataSet();?
????????????sqlAdapter1.Fill(products,?
"products");?
????????????
return?products.Tables[0];?
????????}
?

????????
public?DataRow?GetProduct(int?productID)?
????????
{?
????????????SqlConnection?sqlConnect
=?new?SqlConnection?("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");?
????????????SqlDataAdapter?sqlAdapter1?
=?new?SqlDataAdapter?("Select?*?from?Products?where?productID="?+?productID,?sqlConnect);?
????????????DataSet?product?
=?new?DataSet();?
????????????sqlAdapter1.Fill(product,?
"product");?
????????????
return?product.Tables[0].Rows[0];?
????????}
?

????????
public?DataTable?GetProductCalories(int?productID)?
????????
{?
????????????SqlConnection?sqlConnect?
=?new?SqlConnection?("server=(local);database=CornfieldGrocer;Trusted_Connection=yes");?
????????????SqlDataAdapter?sqlAdapter1?
=?new?SqlDataAdapter?("Select?*?from?Details?where?productID="+productID,sqlConnect);?
????????????DataSet?details?
=?new?DataSet();?
????????????sqlAdapter1.Fill(details,?
"details");?
????????????
return?details.Tables[0];?
????????}
?
????}
?

????
public?class?OrderItem?
????
{?
????????
public?int?productID;?
????????
public?int?quantity;?
????????
public?String?name;?
????????
public?double?price;?

????????
public?OrderItem(int?productID,?String?name,?double?price,?int?quantity)?
????????
{?
????????????
this.productID?=?productID;?
????????????
this.quantity?=?quantity;?
????????????
this.name?=?name;?
????????????
this.price?=?price;?
????????}
?

????????
public?int?ProductID?
????????
{?
????????????
get?{?return?ProductID;?}?
????????}
?

????????
public?int?Quantity?
????????
{?
????????????
get?{?return?quantity;?}?
????????????
set?{?quantity=value;?}?
????????}
?

????????
public?String?Name?
????????
{?
????????????
get?{?return?name;?}?
????????}
?

????????
public?double?Price?
????????
{?
????????????
get?{?return?price;?}?
????????}
?

????????
public?double?Total?
????????
{?
????????????
get?{?return?quantity?*?price;?}?
????????}
?
????}
?

????
public?class?OrderList?
????
{?
????????
private?Hashtable?orders?=?new?Hashtable();?
????????
private?double?taxRate?=?0.08;?

????????
public?double?SubTotal?
????????
{?
????????????
get?
????????????
{?
????????????????
if?(orders.Count?==?0)?
????????????????
return?0.0;?
????????????????
double?subTotal?=?0;?
????????????????IEnumerator?items?
=?orders.Values.GetEnumerator();?
????????????????
while(items.MoveNext())?
????????????????
{?
????????????????????subTotal?
+=?((OrderItem)?items.Current).Price?*?
????????????????????((OrderItem)?items.Current).Quantity;?
????????????????}
?
????????????????
return?subTotal;?
????????????}
?
????????}
?

????????
public?double?TaxRate?
????????
{?
????????????
get?{?return?taxRate;?}?
????????????
set?{?taxRate?=?value;?}?
????????}
?

????????
public?double?Tax?
????????
{?
????????????
get?{?return?SubTotal?*?taxRate;?}?
????????}
?

????????
public?double?Total?
????????
{?
????????????
get?{?return?SubTotal?*?(1?+?taxRate);?}?
????????}
?

????????
public?ICollection?Values?
????????
{?
????????????
get?{?return?orders.Values;?}?
????????}
?

????????
public?OrderItem?this[String?name]?{?
????????????
get?{?return?(OrderItem)?orders[name];?}?
????????}
?

????????
public?void?Add(OrderItem?value)?
????????
{?
????????????
if?(orders[value.Name]?==?null)?
????????????
{?
????????????????orders.Add(value.Name,?value);?
????????????}
?
????????????
else?
????????????
{?
????????????????OrderItem?oI?
=?(OrderItem)orders[value.Name];?
????????????????oI.Quantity?
=?oI.Quantity?+?1;?
????????????}
?
????????}
?

????????
public?void?ClearCart()?{?
????????????orders.Clear();?
????????}
?
????}
?
}
?


  需要說(shuō)明的是我們將三個(gè)文件CornfieldGrocer.cs,Default.aspx.cs,Global.asax.cs用編譯命令“csc /t:library /out:CornfieldGrocer.dll cornfieldgrocer.cs default.aspx.cs global.asax.cs”將它們?nèi)糠庋b在CornfieldGrocer命名空間里,雖然這并不是必須的。上面的編譯器輸出CornfieldGrocer.dll文件,配置該網(wǎng)上零售站點(diǎn)時(shí)只需將該文件拷貝到站點(diǎn)根目錄中的Bin目錄下即可。
  到此為止,已經(jīng)完整的向大家展示了利用ASP.NET Web表單建立一個(gè)小型的網(wǎng)上交易系統(tǒng)的編碼,配置等工作。當(dāng)然作為演示案例,它還沒(méi)有真正系統(tǒng)的完善的性能,安全,界面等各個(gè)方面的優(yōu)化考慮和設(shè)計(jì)。但它向我們展示的ASP.NET Web表單模型卻非常典型且底層,大家不妨在此基礎(chǔ)上通過(guò)不斷的修改和擴(kuò)充來(lái)開(kāi)發(fā)適合自己的交易系統(tǒng)。
  比如對(duì)于Default.aspx文件中AutoEventWireup="false"如果設(shè)置為“true”或去掉這個(gè)語(yǔ)句,在運(yùn)行頁(yè)面時(shí)會(huì)出現(xiàn)什么情況?通過(guò)這些練習(xí)便會(huì)不斷的加深我們對(duì)ASP.NET底層的認(rèn)識(shí),最后達(dá)到游刃有余的把握。實(shí)際上技術(shù)的學(xué)習(xí),尤其是編程,除了一定的興趣和悟性外,大量代碼實(shí)例的鍛煉也是很有必要的,這本身就是筆者成長(zhǎng)的一個(gè)過(guò)程,也是本文中筆者竭力要給大家展示的。

轉(zhuǎn)載于:https://www.cnblogs.com/temptation/archive/2007/06/17/786805.html

總結(jié)

以上是生活随笔為你收集整理的[*转*] 开发B2C电子商务系统(ASP.NET)--多年前的老文章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。