用户控制回发

时间:2009-04-09 20:17:17

标签: c# asp.net postback user-controls

我正在使用用户控件渲染一组购物车项目。可以通过用户控件中的按钮删除每个购物车项目。当移除购物车项目时,我需要直观地显示它的移除。但是,由于在加载页面期间存在购物车项目,因此它将一直保留到页面再次刷新为止。我所追求的是在删除了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>

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 个答案:

答案 0 :(得分:2)

就像在init上将CartItemControls添加到Content的Controls集合一样,您需要在RemoveCartItem_Command上删除它们。通过暴露自己的ItemRemoved事件并在主页面中处理它或通过在RemoveCartItem_Command中调用Parent.Controls.Remove(this)来实现。

或者我错过了什么?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试Server.Transfer到同一页面。

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

答案 3 :(得分:0)

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