电子商务之表示层分析(九)
这里我主要是想分析下这里怎么实现多个数据在页面之间传递。这里要运用到是因为在会员确定要购买物品时候我们会生成一个清单供会员确定,而这里的信息是由上个页面传递过来的,如果用url传递恐怕不太合适。这里采用了一种新的的方法。还记得在电子商务之数据存储流程(五)我们有些页面是继承的BasePage类,而不是System.Web.UI.Page类。这里BasePage类是我们编写的,它也是继承了System.Web.UI.Page类,代码如下

usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Xml.Linq;
usingShop.Common;
///<summary>
///BasePage的摘要说明
///</summary>
publicclassBasePage:System.Web.UI.Page
{
internalconststringKEY_CURRENTUSER="CurrentLoggedInUser";
internalconststringKEY_CURRENTORDER="CurrentOrder";
publicBasePage()
{
}
publicOrdersEntityCurrentOrder
{
get
{
try
{
return(OrdersEntity)(Session[KEY_CURRENTORDER]);
}
catch
{
return(null);//fordesigntime
}
}
set
{
if(value==null)
{
Session.Remove(KEY_CURRENTORDER);
}
else
{
Session[KEY_CURRENTORDER]=value;
}
}
}
publicEndUserEntityCurrentEndUser
{
get
{
try
{
return(EndUserEntity)(Session[KEY_CURRENTUSER]);
}
catch
{
return(null);//fordesigntime
}
}
set
{
if(value==null)
{
Session.Remove(KEY_CURRENTUSER);
}
else
{
Session[KEY_CURRENTUSER]=value;
}
}
}
}
可以看出来实质是将数据存储在session中。例如我们在登录界面中可以将得到EndUser存储到base.CurrentEndUser
在从另外一个页面类读取base.CurrentEndUser即可。
另外说明下当游客结账变为会员的步骤,学习灵活的利用Cookies存储URL
当我们点击结账按钮会发生:
protected
void
commandCheckout_Click(
object
sender,EventArgse)
{
Response.Cookies[ " ReturnURL " ].Value = " CheckOut.aspx " ;
Response.Redirect( " Login.aspx " );
}
{
Response.Cookies[ " ReturnURL " ].Value = " CheckOut.aspx " ;
Response.Redirect( " Login.aspx " );
}
当我们登录成功会发生:

protectedvoidcommandLogin_Click(objectsender,EventArgse)
{
//所有控件都得到验证
if(IsValid)
{
EndUserEntityenduser=newEndUserEntity();
ProcessEndUserLoginprocesslogin=newProcessEndUserLogin();
enduser.UserContactInformation.Email=textUsername.Text;
enduser.Password=textPassword.Text;
processlogin.EndUser=enduser;
try
{
processlogin.Invoke();
}
catch
{
Response.Redirect("ErrorPage.aspx");
}
//验证成功是会员
if(processlogin.IsAuthenticated)
{
Response.Cookies["Authenticated"].Value="True";
//存入到session中去
base.CurrentEndUser=processlogin.EndUser;
//如果用户是强制转过来登录此刻就让他返回原来的页面
if(Request.Cookies["ReturnURL"]!=null)
{
Response.Redirect(Request.Cookies["ReturnURL"].Value);
}
//就返回到默认的页面,也就是用户订单界面
else
{
Response.Redirect("Account/CustomerOrders.aspx");
}
}
else
{
labelMessage.Text="Invalidlogin!";
}
}
这里还分析一下它使用GridView的方法,不像我们平时那样,在每一行添加一个选择,删除,更新命名字段

<
asp:GridView
ID
="gvwBigKind"
runat
="server"
AutoGenerateColumns
="False"
OnRowEditing
="gvwBigKind_RowEditing"
OnRowUpdating ="gvwBigKind_RowUpdating" OnRowCancelingEdit ="gvwBigKind_RowCancelingEdit"
OnRowDeleting ="gvwBigKind_RowDeleting" OnSelectedIndexChanging ="gvwBigKind_SelectedIndexChanging" >
< Columns >
< asp:CommandField HeaderText ="编辑" ShowEditButton ="True" ShowHeader ="True" />
< asp:CommandField HeaderText ="选择" ShowSelectButton ="True" />
< asp:CommandField HeaderText ="删除" ShowDeleteButton ="True"
DeleteText ="&lt;divid="de"οnclick="JavaScript:returnconfirm('确定删除吗?')">删除</div>" />
< asp:BoundField DataField ="总类型编号" HeaderText ="总类型编号" ReadOnly ="true" />
< asp:BoundField DataField ="总类型名称" HeaderText ="总类型名称" />
</ Columns >
</ asp:GridView >
OnRowUpdating ="gvwBigKind_RowUpdating" OnRowCancelingEdit ="gvwBigKind_RowCancelingEdit"
OnRowDeleting ="gvwBigKind_RowDeleting" OnSelectedIndexChanging ="gvwBigKind_SelectedIndexChanging" >
< Columns >
< asp:CommandField HeaderText ="编辑" ShowEditButton ="True" ShowHeader ="True" />
< asp:CommandField HeaderText ="选择" ShowSelectButton ="True" />
< asp:CommandField HeaderText ="删除" ShowDeleteButton ="True"
DeleteText ="&lt;divid="de"οnclick="JavaScript:returnconfirm('确定删除吗?')">删除</div>" />
< asp:BoundField DataField ="总类型编号" HeaderText ="总类型编号" ReadOnly ="true" />
< asp:BoundField DataField ="总类型名称" HeaderText ="总类型名称" />
</ Columns >
</ asp:GridView >
这里没有在每一行开头给出编辑,删除按钮,却能完成上面的功能

<
asp:GridView
ID
="gridviewShoppingCart"
runat
="server"
AutoGenerateColumns
="false"
DataKeyNames
="Quantity,ShoppingCartID"
OnRowDataBound ="gridviewShoppingCart_RowDataBound" Width ="100%" BorderWidth ="0px" CellPadding ="2" ShowHeader ="false" >
< Columns >
< asp:TemplateField ItemStyle-Width ="16%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
< asp:CheckBox ID ="checkboxDelete" runat ="server" />
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="30%" >
< ItemTemplate >
<% # Eval ( " ProductName " ) %>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="17%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
< asp:TextBox id ="textQuantity" runat ="server" Columns ="4" MaxLength ="3" Text ='<%# Eval("Quantity")% > 'width="30px"CssClass="textfield"/>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="18%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
<% # Eval ( " UnitPrice " , " {0:c} " ) %>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="19%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
<% # Eval ( " TotalPrice " , " {0:c} " ) %>
</ ItemTemplate >
</ asp:TemplateField >
</ Columns >
</ asp:GridView >
OnRowDataBound ="gridviewShoppingCart_RowDataBound" Width ="100%" BorderWidth ="0px" CellPadding ="2" ShowHeader ="false" >
< Columns >
< asp:TemplateField ItemStyle-Width ="16%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
< asp:CheckBox ID ="checkboxDelete" runat ="server" />
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="30%" >
< ItemTemplate >
<% # Eval ( " ProductName " ) %>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="17%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
< asp:TextBox id ="textQuantity" runat ="server" Columns ="4" MaxLength ="3" Text ='<%# Eval("Quantity")% > 'width="30px"CssClass="textfield"/>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="18%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
<% # Eval ( " UnitPrice " , " {0:c} " ) %>
</ ItemTemplate >
</ asp:TemplateField >
< asp:TemplateField ItemStyle-Width ="19%" ItemStyle-HorizontalAlign ="center" >
< ItemTemplate >
<% # Eval ( " TotalPrice " , " {0:c} " ) %>
</ ItemTemplate >
</ asp:TemplateField >
</ Columns >
</ asp:GridView >
还加上一个更新按钮,这里在GridView中checkbox打上勾的不会立即删除,而是点击更新按钮之后会更新。如果要改变商品数量直接重新输入在点击更新即可

///
<summary>
/// 通过循环来更新购物车
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
protected void commandUpdate_Click( object sender,EventArgse)
{
foreach (GridViewRowrow in gridviewShoppingCart.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
DataKeydata = gridviewShoppingCart.DataKeys[row.DataItemIndex];
CheckBoxcheck = (CheckBox)row.FindControl( " checkboxDelete " );
if (check.Checked)
{
Delete( int .Parse(data.Values[ " ShoppingCartID " ].ToString()));
}
TextBoxtextNewQuantity = (TextBox)row.FindControl( " textQuantity " );
int integerNewQuantity = int .Parse(textNewQuantity.Text);
// 这里可以获得原来
int integerOrigQuantity = int .Parse(gridviewShoppingCart.DataKeys[row.DataItemIndex].Value.ToString());
// 数量不相等证明购物车中商品数量改变了,就要实行刷新
if (integerNewQuantity != integerOrigQuantity)
{
Update( int .Parse(data.Values[ " ShoppingCartID " ].ToString()),integerNewQuantity);
}
}
}
// 重新绑定数据
LoadShoppingCart();
}
private void Update( int id, int newqty)
{
ProcessUpdateShoppingCartprocessupdate = new ProcessUpdateShoppingCart();
ShoppingCartEntityshoppingcart = new ShoppingCartEntity();
shoppingcart.Quantity = newqty;
shoppingcart.ShoppingCartID = id;
processupdate.ShoppingCart = shoppingcart;
try
{
processupdate.Invoke();
}
catch
{
Response.Redirect( " ErrorPage.aspx " );
}
}
private void Delete( int id)
{
ProcessDeleteShoppingCartprocessdelete = new ProcessDeleteShoppingCart();
ShoppingCartEntityshoppingcart = new ShoppingCartEntity();
shoppingcart.ShoppingCartID = id;
processdelete.ShoppingCart = shoppingcart;
try
{
processdelete.Invoke();
}
catch
{
Response.Redirect( " ErrorPage.aspx " );
}
}
/// 通过循环来更新购物车
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
protected void commandUpdate_Click( object sender,EventArgse)
{
foreach (GridViewRowrow in gridviewShoppingCart.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
DataKeydata = gridviewShoppingCart.DataKeys[row.DataItemIndex];
CheckBoxcheck = (CheckBox)row.FindControl( " checkboxDelete " );
if (check.Checked)
{
Delete( int .Parse(data.Values[ " ShoppingCartID " ].ToString()));
}
TextBoxtextNewQuantity = (TextBox)row.FindControl( " textQuantity " );
int integerNewQuantity = int .Parse(textNewQuantity.Text);
// 这里可以获得原来
int integerOrigQuantity = int .Parse(gridviewShoppingCart.DataKeys[row.DataItemIndex].Value.ToString());
// 数量不相等证明购物车中商品数量改变了,就要实行刷新
if (integerNewQuantity != integerOrigQuantity)
{
Update( int .Parse(data.Values[ " ShoppingCartID " ].ToString()),integerNewQuantity);
}
}
}
// 重新绑定数据
LoadShoppingCart();
}
private void Update( int id, int newqty)
{
ProcessUpdateShoppingCartprocessupdate = new ProcessUpdateShoppingCart();
ShoppingCartEntityshoppingcart = new ShoppingCartEntity();
shoppingcart.Quantity = newqty;
shoppingcart.ShoppingCartID = id;
processupdate.ShoppingCart = shoppingcart;
try
{
processupdate.Invoke();
}
catch
{
Response.Redirect( " ErrorPage.aspx " );
}
}
private void Delete( int id)
{
ProcessDeleteShoppingCartprocessdelete = new ProcessDeleteShoppingCart();
ShoppingCartEntityshoppingcart = new ShoppingCartEntity();
shoppingcart.ShoppingCartID = id;
processdelete.ShoppingCart = shoppingcart;
try
{
processdelete.Invoke();
}
catch
{
Response.Redirect( " ErrorPage.aspx " );
}
}