проблема жизненного цикла страницы asp.net - PullRequest
1 голос
/ 07 марта 2012

У меня есть пользовательский элемент управления «заголовок» с меткой для отображения количества товара в корзине.он делает что-то вроде этого:

protected void Page_Load(object sender, EventArgs e)
{
    lblBasketCount.Text = Session["basketItemsCount"]!=null?Session["basketItemsCount"].ToString():"0";
}

Тогда у меня есть страница с методом:

public void btnAddItemToShoppingCart_Click(object sender, EventArgs )
{
    Session["basketItemsCount"] = (from b in db.CartItems where b.crt_ID == cartId select b).Sum(p => p.item_quantity);
}

Проблема в том, что в жизненном цикле страницы метод addItem запускается после того, как элемент управленияуже было событие Page_Load.поэтому мой ярлык обновится только после очередной перезагрузки страницы. Edit: Элемент управления заголовка объявлен на главной странице:

<%@ Register TagPrefix="asp" TagName="Footer" Src="~/Controls/Footer.ascx" %>
    <asp:Header ID="Header" runat="server" />

и находится в папке элементов управления.

Я использую WAP, поэтому он находится в пространстве имен Sitename.Controls.Header

Ответы [ 3 ]

1 голос
/ 07 марта 2012

Не использовать Page_Load событие (или другие события страницы) в UserControls. Это приведет к таким проблемам. Вместо этого вы должны использовать свойства, методы и события в вашем элементе управления.

Например, вы можете иметь свойство BasketCount в вашем UserControl:

public String BasketCount
{
    get { lblBasketCount.Text; }
    set { lblBasketCount.Text = value; }
}

Тогда ваша страница может использовать это свойство:

var basketCount = (from b in db.CartItems where b.crt_ID == cartId select b).Sum(p => p.item_quantity);
Session["basketItemsCount"] = basketCount;
MyControl.BasketCount = basketCount.ToString();

Чтобы получить ссылку на элемент управления в вашем MasterPage, вы должны предоставить общедоступное свойство, которое соответствует ему:

Например (в MasterPage):

public Header HeaderControl
{
     get
     {
         return Header;
     }
}

И вы можете вызывать это свойство с одной из ваших страниц ContentPages следующим образом (например, если тип вашего мастера называется « SiteMaster »):

((SiteMaster)Page.Master).HeaderControl.BasketCount = basketCount.ToString();
1 голос
/ 07 марта 2012

В дополнение к предыдущим ответам, другой способ выполнить то, что вы хотите, это использовать панель обновлений для элемента управления, который показывает количество товаров в корзине.

http://msdn.microsoft.com/en-us/library/bb399001.aspx

Таким образом, вы можете обновить его даже после загрузки страницы.

0 голосов
/ 07 марта 2012

Не используйте состояние сеанса для этого.

В пользовательском элементе управления добавьте свойство BasketItemsCount.

В Page_Init главной страницы установите свойство.

В Page_Load пользовательского элемента управления используйте свойство для установки метки.

...