我创建了Master页面,该页面的主页上有mainNavigator面板,它是一个Web用户控件(BuildMenu.ascx)。我在主页的加载中填写UC菜单:
<%@ 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(在母版页中)
答案 0 :(得分:3)
除非您想使用框架(并且您可能没有),否则每次都必须重新加载控件,以便可以渲染它。您可以做的最好是使用服务器端输出缓存,以便加载控件所需的处理时间更短。
要进行输出缓存,请将其放在页面中:
<%@ OutputCache Duration="[Number of Seconds]" VaryByParam="None" %>
答案 1 :(得分:1)
每次发生回发时都会调用加载方法 WILL (AJAX页面除外,但不要去那里)。看看ASP.NET page lifecycle。
如果IsPostBack的值为真,你可以做的只是从控件Load事件返回。
但是,如果有问题的控件在内容中是静态的(或几乎是静态的),您可以尝试在服务器上使用output cashing,这样控件将偶尔加载一次,其余时间,服务器只会使用它的兑现副本。
答案 2 :(得分:0)
我有一个更好的主意,为什么你不起诉它会帮助你
像这样::
protected void Page_Load(object sender,EventArgs e) {
if session(ispostback") <> "menuloaded"
{
// Fill Menu from DataBase (Compare SiteMap...)
Session("ispostback")="menuloaded"
}
这肯定会有用