Я опаздываю на вечеринку с принятым ответом и наградой в 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
в обычном режиме, захватит вывод и сохранит его в кеше.
В вашем случае вам, конечно, понадобится немного больше логики, которая проверила бы соответствующее свойство в элементе управления и использовала бы это, чтобы проверить, существует ли кешированная версия.
Заявление об ограничении ответственности: это очень простой контрольный тест. Я не пытался понять, как заставить все это работать с элементами управления, которые содержат обработчики событий и т. Д. Так что принимайте это как следует ...
person
user1429080
schedule
05.09.2014
VaryByControl
должен соответствовать идентификатору пользовательского элемента управления для кеширования, а не только произвольному свойству элемента управления. Если вы проверите, что элемент управления существует в коде позади, а затем установите переменную, которая будет использоваться вашимNewStore:LeftMenuLinks
пользовательским элементом управления, будет ли это работать? - person Justin   schedule 29.08.2014