2

我正在使用用户控件呈现一组购物车项目。可以通过用户控件中的按钮删除每个购物车项目。当购物车物品被移除时,我需要直观地显示它的移除。但是,由于购物车项目在页面加载期间存在,它会一直保留到页面再次刷新。我所追求的是一种在完成删除 caritem 的工作后刷新页面的方法。

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>

UserControl 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);
    }
}
}
4

4 回答 4

2

正如您在初始化时将 CartItemControls 添加到 Content 的 Controls 集合中一样,您需要在 RemoveCartItem_Command 上删除它们。通过公开您自己的 ItemRemoved 事件并在主页中处理它或在 RemoveCartItem_Command 中调用 Parent.Controls.Remove(this) 来执行此操作。

还是我错过了什么?

于 2009-04-10T02:10:08.867 回答
0

尝试Server.Transfer到同一页面。

也就是说,考虑使用 Ruslan 方法,通过公开 ItemRemoved 事件并在主页上处理它。您可以执行 Content.Controls.Clear 并再次调用 CreateCartItemControls。

于 2009-04-10T03:12:35.893 回答
0

只需在每次回发时重新绑定主页上的所有内容。

于 2009-04-10T03:15:42.953 回答
0

Response.Redirect 在您完成删除购物车项目后返回页面。

于 2009-04-09T22:25:03.510 回答