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