2011-01-31 17 views
1

我創建了MasterNavigator面板,該面板位於網頁用戶控件(BuildMenu.ascx)的頂部。我在填充母版頁加載UC菜單:如何在Master Page中只加載一次菜單?


<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="IntermMaster.master.cs" Inherits="MyProject.IntermMaster" EnableViewState="true" %> 

<%@ Register src="Utils/BuildMenu.ascx" tagname="BuildMenu" tagprefix="uc1" %> 

> 
    <asp:ContentPlaceHolder ID="head" runat="server"> 

    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <form id="form1" runat="server"> 

     <uc1:BuildMenu ID="BuildMenu2" runat="server" /> 
    </div> 
    <div> 

     <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> 
     </asp:ContentPlaceHolder> 
    </div> 
    </form> 
</body> 

這是加載在回發事件:

BuildMenu.ascx.cs


    protected void Page_Load(object sender, EventArgs e) 
     { 

      if (!IsPostBack) 
      { 
       // Fill Menu from DataBase (Compare SiteMap...) 
      } 

每次回來後BuildManu.ascx加載每次這真的讓我感到無聊。我該如何解決它。我想除非你想用幀只做一次負載BuildMenu.ascx(在母版頁)

enter image description here

+0

該控件總是再次加載,如果只是審查是否有任何改變。呈現的控件被緩存,以防萬一沒有任何變化,將不再需要花費更多的計算時間來顯示控件,它將使用緩存的版本。你不應該擔心這個,緩存會保存你的性能,並且如果你的控件發生了一些變化,你不必刷新緩存來查看變化。我個人認爲這是預期的行爲恕我直言。明顯打開討論... – Bazzz 2011-01-31 08:06:05

+0

@Bazzz;我同意你的意見,請稍等一下。我認爲這真的是胡說八道。爲什麼我可以只填寫內容的地方持有人...... – Penguen 2011-01-31 12:17:12

回答

3

(你可能沒有),控制具有每次因此它可以被重新加載被渲染。您可以做的最好的做法是使用服務器端輸出緩存,以便加載控件所需的處理時間更少。

要做到輸出緩存,把這個在您的網頁:

<%@ OutputCache Duration="[Number of Seconds]" VaryByParam="None" %> 
+0

謝謝,但我添加母版頁不工作我從主人刪除我添加任何網頁不工作:( – Penguen 2011-01-31 08:11:27

1

Load方法WILL被稱爲每次回發occures(除AJAX頁面,但我們不要去那裏)。看看ASP.NET page lifecycle

您可以做的只是從控件返回Load事件,如果IsPostBack的值爲true。但是,如果所討論的控件在內容中是靜態的(或幾乎是靜態的),則可以嘗試在服務器上使用output cashing,這樣一來控件就會偶爾加載一次,而其餘時間,服務器將只使用它的現金副本。

0

我有更好的想法你爲什麼不起訴會話它會幫助你

做出這樣的:

保護無效的Page_Load(對象發件人,EventArgs的){

 if session(ispostback") <> "menuloaded" 
     { 
      // Fill Menu from DataBase (Compare SiteMap...) 
      Session("ispostback")="menuloaded" 
     } 

這將工作肯定