2012-03-07 23 views
1

私は、バスケット内のアイテムの量を表示するためのラベル付きのユーザーコントロール "ヘッダー"を持っています。asp.netページのライフサイクルの問題

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

問題は、コントロールが既にPage_Loadイベントを持っていたされた後、ページのライフサイクルでのaddItemメソッドが発射されるということです。私のラベルはページの別のリロード後にのみ更新されます。
編集:

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

とコントロールフォルダにあり:
ヘッダーコントロールは、マスターページで宣言されています。

その名前空間Sitename.Controls.Header

+0

Page_PreRenderを代わりに使用してください。このイベントは、すべてのコントロールが表示される直前に発生します。 –

答えて

1

Page_Loadイベント(または他のページイベント)をUserControlsに使用しないでください。これは、このような問題につながります。 代わりに、コントロール内でプロパティ、メソッド、およびイベントを使用する必要があります。あなたは、たとえばユーザーコントロールにプロパティBasketCountを持つことができ

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であなたがすべき

たとえば、(マスターページ内に):

public Header HeaderControl 
{ 
    get 
    { 
     return Header; 
    } 
} 

あなたは、この方法であなたのContentPagesからこのプロパティを呼び出すことができます。ご主人のタイプが「SiteMaster」)と命名されている場合:以前の回答に加えて

((SiteMaster)Page.Master).HeaderControl.BasketCount = basketCount.ToString(); 
+0

私はこれを試しているし、動作しません。 私はできません MyControl.BasketCount = basketCount.ToString(); MyControl ctrl =(MyControl)LoadControl( "MyControl.aspx"); 私はこのような何かをする必要があると思います。 それから何もしません。 –

+0

@ SergejPopov:UserControlへの参照が必要です。しかし、私はあなたがそれを得ることができると確信しています。 UserControlが宣言されている場所(GridViewのようなコンテナコントロールやMasterPageなど)を教えてください。質問を編集して、宣言された場所を表示します。 –

+0

更新ありがとうございます。 –

0

で、このためにセッション状態を使用しないでくださいので、私は、WAPを使用しています。

ユーザーコントロールで、BasketItemsCountプロパティを追加します。

メインページのPage_Initには、プロパティを設定します。

ユーザーコントロールのPage_Loadでは、プロパティを使用してラベルを設定します。

1

、あなたが望むものを達成する別の方法は、中項目の量を示して制御するために、更新パネルを使用することですカート。

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

あなたは、ページがロードされた後であっても、それを更新することができますこの方法。

関連する問題