2009-04-09 37 views
2

我正在使用用戶控件呈現一組購物車項目。每個購物車項目都可以通過用戶控件中的按鈕移除。當購物車項目被刪除時,我需要直觀地顯示它的移除。但是,由於購物車項目在加載頁面期間一直存在,直到頁面再次刷新。我所追求的是在完成刪除cartitem的工作後刷新頁面的方法。用戶控制回發

cart.aspx.cs背後的代碼如下所示:

protected void Page_Init(object sender, EventArgs e) 
{ 
    CreateCartItemControls(); 
} 

private void CreateCartItemControls() 
{ 
    foreach (CartItem ci in Profile.Cart.Items) 
    { 
     ASP.CartItemControl cic = new ASP.CartItemControl(); 
     cic.ItemName = ci.Name; 

     cic.CartID = ci.ID; 
     cic.Cost = ci.BaseCost.ToString("c"); 
     cic.ItemComponents = ci.Components; 

     cic.CartItemRemoved += new EventHandler(CartItemRemoved); 

     Content.Controls.Add(cic); 
    } 
} 

void CartItemRemoved(object sender, EventArgs e) 
{ 
    Master.UpdateCartItemCount(); 
} 

標記爲CartItemControl.ascx

<%@ Control Language="C#" ClassName="CartItemControl" AutoEventWireup="true" 
    CodeFile="CartItemControl.ascx.cs" 
    Inherits="UserControls_CartItemControl" %> 
<fieldset id="FieldSet" runat="server"> 
    <legend> 
     <asp:HyperLink ID="ItemLink" runat="server" /> 
    </legend> 
    <asp:ImageButton ID="RemoveCartItem" AlternateText="Remove Item" 
     ImageUrl="~/img/buttons/remove_4c.gif" runat="server" 
     CommandName="Remove" OnCommand="RemoveCartItem_Command" /> 
    <asp:Label ID="TotalItemCost" runat="server" Text="$0.00" /> 
    <ol> 
     <li runat="server" id="ComponentsLI" visible="false"> 
      <fieldset id="ComponentsFieldSet" runat="server"> 
       <legend>Item Components</legend> 
       <asp:CheckBoxList ID="ItemComponentsCheckList" 
        runat="server" /> 
      </fieldset> 
     </li> 
    </ol> 
</fieldset> 

代碼背後的用戶控件CartItemControl.ascx.cs

public partial class UserControls_CartItemControl 
: System.Web.UI.UserControl 
{ 
public string ItemName { get; set; } 
public int CartID { get; set; } 
public string Cost { get; set; } 
public IDictionary<int, SoftwareComponent> ItemComponents { get; set; } 

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    SetCartItemControlAttributes(); 
} 

private void SetCartItemControlAttributes() 
{ 
    ItemLink.Text = ItemName; 
    TotalItemCost.Text = Cost; 

    RemoveCartItem.CommandArgument = CartID.ToString(); 

    if (!ItemComponents.Count.Equals(0)) 
    { 
     ComponentsLI.Visible = true; 
     foreach (KeyValuePair<int, ItemComponent> kvp in 
      ItemComponents) 
     { 
      ItemComponentsCheckList.Items.Add(
       new ListItem(string.Format("{0} {1}", 
        kvp.Value.ComponentName, 
        kvp.Value.ComponentCost.ToString("c")), 
        kvp.Key.ToString())); 
     } 
    } 
} 

public event EventHandler CartItemRemoved; 

protected void RemoveCartItem_Command(object sender, CommandEventArgs e) 
{ 
    int itemID; 

    if (int.TryParse(e.CommandArgument.ToString(), out itemID)) 
    { 
     Profile.Cart.RemoveCartItem(itemID); 
     CartItemRemoved(sender, e); 
     Parent.Controls.Remove(this); 
    } 
} 
} 
+0

修改爲反映選定的答案 – ahsteele 2009-04-10 04:21:12

回答

2

就像在init上將CartItemControls添加到Content的Controls集合一樣,您需要在RemoveCartItem_Command上刪除它們。通過公開自己的ItemRemoved事件並在主頁面中處理它或通過在RemoveCartItem_Command中調用Parent.Controls.Remove(this)來實現此目的。

或者我錯過了什麼?

+0

用於暴露事件 – eglasius 2009-04-10 03:13:04

0

在完成刪除購物車項目的工作後,將Response.Redirect返回到頁面。

+0

我想到了這個選項,但它真的是唯一的選擇嗎?它當然是最簡單的,但不會丟失任何其他回傳數據? – ahsteele 2009-04-09 23:26:38

0

嘗試Server.Transfer到同一頁面。

這就是說,考慮使用Ruslan的方法,通過暴露一個ItemRemoved事件並在主頁上處理它。你可以做Content.Controls.Clear並再次調用CreateCartItemControls。

0

只需在每次回傳中重新綁定主頁上的所有內容。