基礎版 Html.Cache 接受 Func<string> 委托,雖能快取字串片段,但大段 HTML 仍需建立 Partial View,使用不便:
<%= Html.Cache(..., () => Html.Partial("MyPartialViewToCache")) %>
理想的用法應像標記一樣「包圍」現有程式碼:
<% Html.Cache("cache_key", DateTime.Now.AddSeconds(10), () => { %>
<% foreach (var article in Model.Articles) { %>
<p><%= article.Body %></p>
<% } %>
<% }); %>
這要求方法簽名改為 Action:
public static void Cache(
this HtmlHelper htmlHelper,
string cacheKey,
CacheDependency cacheDependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
Action action)
{
// 實作邏輯
}
關鍵挑戰在於:Action 執行時將內容寫入 HtmlTextWriter,我們如何攔截並取得生成的字串?答案在於 Page.CreateHtmlTextWriter 方法:
protected virtual HtmlTextWriter CreateHtmlTextWriter(System.IO.TextWriter tw) { ... }
透過自訂 HtmlTextWriter 實作,我們能在委托執行期間捕獲輸出,實現真正的「標記式」片段快取體驗。