,我遲到了這裏什麼與接受的答案和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