,我迟到了这里什么与接受的答案和500点赏金奖励。仍然想给我几分钱如何实现这一目标。
它可以在控制本身工作。如果找到,您可以让控件将其自己的输出存储在缓存中,并使用Render
方法中的缓存版本。我做了一个非常简单的UserControl
来测试。该标记看起来是这样的:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestUC.ascx.cs"
Inherits="Webforms_Test.UserControls.TestUC" %>
<div>
<asp:Label ID="curTime" runat="server"></asp:Label>
</div>
它只是包含初始化时被设置为DateTime.Now
的标签。后面的代码看起来是这样的:
public partial class TestUC : System.Web.UI.UserControl
{
private string cachedOutput = null;
public bool RenderFromCache = true; // set to false in containing page if this control needs to be re-rendered
protected void Page_Load(object sender, EventArgs e)
{
cachedOutput = HttpContext.Current.Cache["key"] as string;
if (cachedOutput == null)
{
// not found in cache, do the heavy lifting here to setup the control
curTime.Text = "UC:" + DateTime.Now.ToString("yy-MM-dd hh:mm:ss");
}
}
protected void Page_PreRender(object sender, EventArgs e)
{
if (cachedOutput == null || !RenderFromCache)
{
RenderFromCache = false;
StringBuilder b = new StringBuilder();
HtmlTextWriter h = new HtmlTextWriter(new StringWriter(b));
this.RenderControl(h);
cachedOutput = b.ToString();
HttpContext.Current.Cache.Insert("key", cachedOutput, null, DateTime.UtcNow.AddSeconds(10), TimeSpan.Zero);
RenderFromCache = true;
}
}
protected override void Render(HtmlTextWriter writer)
{
if (!RenderFromCache)
base.Render(writer);
else
writer.Write(cachedOutput);
}
}
在此示例中,如果其输出在高速缓存中找到该控件本身检查,如果是这样的Render
方法只写缓存的输出。如果在缓存中找不到,则PreRender
方法将正常运行Render
方法,并捕获输出并将其存储在缓存中。
在你的情况下,你当然需要更多的逻辑来检查控件上的相关属性,并使用它来检查缓存版本是否存在。
免责声明:这是一个非常简单的测试控件。我还没有试图找出如何使用包含事件处理程序等的控件来完成所有这些工作。因此,请考虑它的价值...
'VaryByControl'属性应该与用户控件的ID匹配缓存,而不仅仅是控件的任意属性。如果你检查后面的代码中存在控件,然后设置你的'NewStore:LeftMenuLinks'用户控件使用的变量,它是否工作? – Justin 2014-08-29 16:20:41
您在数据绑定控件中是否具有SelectedCatID =“<%#SelectedCatID%>”版本,还是只绑定到页面类的属性? SelectedCatID和SelectedMenu之间的关系是什么?或者这只是一个错字? – 2014-09-02 12:07:11
@menno错字,现在修复! – 2014-09-02 12:54:12