Пользовательский контроль обратной передачи - PullRequest
2 голосов
/ 10 апреля 2009

Я работаю над рендерингом набора элементов корзины, используя пользовательский элемент управления. Каждый элемент корзины может быть удален с помощью кнопки в пользовательском элементе управления. Когда корзина удалена, мне нужно визуально показать ее удаление. Однако, поскольку элемент корзины существовал во время загрузки страницы, он остается до тех пор, пока страница не будет обновлена ​​снова. Что мне нужно, так это средство обновить страницу после того, как работа по удалению 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 ]

2 голосов
/ 10 апреля 2009

Так же, как вы добавляете CartItemControls в коллекцию Contents Controls при инициализации, вам необходимо удалить их в RemoveCartItem_Command. Сделайте это, выставив свое собственное событие ItemRemoved и обработав его на главной странице, или вызвав Parent.Controls.Remove (this) внутри RemoveCartItem_Command.

Или я что-то упустил?

0 голосов
/ 10 апреля 2009

Просто перепривязывайте все на главной странице при каждой обратной передаче.

0 голосов
/ 10 апреля 2009

Попробуйте Server.Transfer на той же странице.

Тем не менее, рассмотрите возможность использования подхода Руслана, выставив событие ItemRemoved и обработав его на главной странице. Вы можете сделать Content.Controls.Clear и снова вызвать CreateCartItemControls.

0 голосов
/ 10 апреля 2009

Response. Вернитесь обратно на страницу после выполнения работы по удалению элемента корзины.

...