Я опоздал на вечеринку здесь, что с принятым ответ и 500 точки Баунти в присужденной. Все еще хотелось дать мои небольшие центы о том, как это можно достичь.
Это может быть сделано для работы в самом управлении. Вы можете иметь хранилище управления в собственном виде в кеше и использовать кешированную версию в методе , если он найден. Я сделал очень простой 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' должен соответствовать идентификатору пользовательского элемента управления для кэширования, а не только для произвольного свойства элемента управления. Если вы проверите, что элемент управления существует в коде позади, а затем установите переменную, которая будет использоваться вашим пользовательским элементом 'NewStore: LeftMenuLinks', работает ли он? – Justin
У вас есть версия SelectedCatID = "<% # SelectedCatID%>" в элементе управления с привязкой к базе данных или она просто привязана к свойству класса страницы? Какова связь между SelectedCatID и SelectedMenu? Или это просто опечатка? –
@menno опечатка, крепление сейчас! –