购物车显示用户已经选择购买的图书。它还提供选项修改每本选中的图书的数量。
实现
“Shopping Cart”(购物车)页使用下面的 ASP.NET 文件和 C# 或 Visual Basic .NET 代码隐藏文件:
ShoppingCart.aspx
ShoppingCart.aspx.cs
ShoppingCart.aspx.vb
注意 有关 ASP.NET 代码隐藏的更多信息,请参见创建 ASP.NET Web 应用程序。
过程概述
用户从 ASP.NET 页顶部选择购物车选项或者在图书选区选择“Add To Cart”(添加到购物车)按钮后,应用程序显示“Shopping Cart”(购物车)页。若要继续运行到结帐,用户须单击“Proceed to Checkout”(前进到结帐)链接。有关更多信息,请参见结帐。在购物车中,用户可以修改每本选中图书的数量。当用户单击“Update”(更新)按钮时,Duwamish7.Web.ShoppingCart.UpdateButton_Click 方法调用 Duwamish7.Web.Cart.UpdateItems 方法更改数量。(每项所允许的最大数量为 50。)当用户输入的数量为零时,Duwamish7.Web.Cart.UpdateItems 方法还处理图书的删除操作。
结构决策
从 Web 层没有处理购物车管理的调用,因此可伸缩性和性能都得到了提高。这种方法的不利因素是如果会话状态超时,购物车可能丢失。另一种方法是退出购物车返回 SQL。有关 Duwamish 7.0 中的会话状态的进一步信息,请参见用户服务。
Web 源代码
Duwamish7.Web.ShoppingCart.UpdateButton_Click 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Web/ShoppingCart.aspx.cs 文件。Duwamish7.Web.Cart.UpdateItems 方法源代码的默认位置是 [安装 Visual Studio .NET 的驱动器号]:/Program Files/Microsoft Visual Studio .NET 2003/Enterprise Samples/Duwamish 7.0 CS/Web/Cart.cs 文件。
注意 如果安装了 Visual Basic .NET 版本,则 Duwamish 7.0 VB 将替换路径中的 Duwamish 7.0 CS,其文件名相同,但扩展名是 vb 而不是 cs。
Duwamish7.Web.ShoppingCart.UpdateButton_Click 方法:
[C#]
/// <summary>
/// Update the quantity of item(s) in the shopping cart and then display the contents
/// of the cart.
/// <param name="sender">The source of the event.</param>
/// <param name="e">An EventArgs that contains the event data.</param>
/// </summary>
public void UpdateButton_Click(Object sender, EventArgs e)
{
bool cartHasItems = false; //Set if the cart contains items
Cart shoppingCart = ShoppingCart(false);
if (!shoppingCart.IsEmpty)
{
if (!Page.IsValid)
{
return;
}
//
// Validators have run so we can assume valid input
//
//
// reset the quanities for all the items in cart
//
DataRowCollection orderRows = shoppingCart.OrderItems.Rows;
int i = 0;
foreach (DataGridItem item in CartItemsDataGrid.Items)
{
//update the quantity
orderRows[i][1] = Int32.Parse(((TextBox)item.FindControl("QuantityTextBox")).Text);
++i;
}
shoppingCart.UpdateItems();
cartHasItems = !shoppingCart.IsEmpty;
if (cartHasItems)
{
//Bind the DataGrid to the items
CartItemsDataGrid.DataSource = (ICollection)shoppingCart.OrderItems.DefaultView;
CartItemsDataGrid.DataBind();
}
}
//
// Set visibility of displayed items to correspond to
// whether or not we have items in the cart.
//
ShoppingCartPanel.Visible = cartHasItems;
CartItemsDataGrid.Visible = cartHasItems;
CheckOutHyperLink.Visible= cartHasItems;
EmptyCartLabel.Visible = !cartHasItems;
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Sub UpdateButton_click:
' Update the quantity of item(s) in the shopping cart and then display the contents
' of the cart
' Parameters:
' [in] sender: not used
' [in] e: not used
'----------------------------------------------------------------
Private Sub UpdateButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim cartHasItems As Boolean 'Set if the cart contains items
Dim i As Integer 'loop index
Dim quantityString as String 'used for conversion checks
Dim quantity as Integer 'used to set the items updated quanity
Dim item As DataGridItem 'used to access the individual grid items
Dim quantityTextBox As TextBox 'used to access the individual TextBoxes
Dim row As DataRow 'used to access the individual DataRows
With ShoppingCart(False)
If Not .IsEmpty Then
If Not Page.IsValid Then
Return
End If
'
' Validators have run so we can assume valid input
'
'
' reset the quanities for all the items in cart
'
For i = 0 To CartItemsDataGrid.Items.Count - 1
item = CartItemsDataGrid.Items(i)
quantityTextBox = CType(Item.FindControl("QuantityTextBox"), TextBox)
quantityString = quantityTextBox.Text
quantity = CInt(quantityString)
row = .OrderItems.Rows(i)
'update the quantity
row(1) = quantity
Next i
.UpdateItems()
cartHasItems = Not .IsEmpty
If cartHasItems Then
'Bind the DataGrid to the items
CartItemsDataGrid.DataSource = CType(.OrderItems.DefaultView, System.Collections.ICollection)
CartItemsDataGrid.DataBind
End If
End If
End With
'
' Set visibility of displayed items to correspond to
' whether or not we have items in the cart.
'
ShoppingCartPanel.Visible = cartHasItems
CartItemsDataGrid.Visible = cartHasItems
CheckOutHyperLink.Visible= cartHasItems
EmptyCartLabel.Visible = Not cartHasItems
End Sub
Duwamish7.Web.Cart.UpdateItems 方法:
[C#]
/// <summary>
/// Updates the Items in the shopping cart.
/// </summary>
public void UpdateItems()
{
int quantity;
int itemsCount = OrderItems.Rows.Count;
DataRow row;
for (int i = 0; i < itemsCount; i++)
{
row = OrderItems.Rows[i];
quantity = Int32.Parse(row[OrderData.QUANTITY_FIELD].ToString());
if (quantity < 1)
{
row.Delete();
itemsCount--;
i--;
}
else
{
row[OrderData.EXTENDED_FIELD] = (Decimal)row[OrderData.PRICE_FIELD] * quantity;
}
}
}