使用不可缓存的形式在 ASP.NET MVC 中缓存
Caching in ASP.NET MVC with uncachable forms
我正在使用 MVCDonutCaching 库进行甜甜圈缓存。
使用此库进行甜甜圈缓存的背景:
它的工作方式是,您可以缓存一个视图,但将其中的一部分排除在缓存之外,即 "donut hole"。为此,您可以将不可缓存的内容作为局部视图,由子操作呈现。然后在视图中调用该子操作 Html.RenderAction(...
。这样,除了子操作之外的所有内容都将被缓存。
问题:
我需要缓存一个包含表单的视图。问题是表单包含一个 AntiForgeryToken
,显然不应该被缓存。
一个明显的解决方案是使该表单成为 "donut hole",并通过
一个子动作。但是,它需要复杂的视图模型数据,并且子操作只接受原始类型作为参数,否则我会得到序列化错误。
解决这个问题的好方法是什么?
找到方法了。不确定它是否是最佳的,但它有效。
我没有将表单设为 "donut hole",而是将防伪标记本身设为甜甜圈洞。
[ChildActionOnly]
public virtual ContentResult GetAntiForgeryToken() {
using (var viewPage = new ViewPage()) {
var htmlHelper = new HtmlHelper(new ViewContext(), viewPage);
var token = htmlHelper.AntiForgeryToken();
return Content(token.ToHtmlString());
}
}
这需要创建一个虚拟的 HtmlHelper,然后手动创建令牌。
我正在使用 MVCDonutCaching 库进行甜甜圈缓存。
使用此库进行甜甜圈缓存的背景:
它的工作方式是,您可以缓存一个视图,但将其中的一部分排除在缓存之外,即 "donut hole"。为此,您可以将不可缓存的内容作为局部视图,由子操作呈现。然后在视图中调用该子操作 Html.RenderAction(...
。这样,除了子操作之外的所有内容都将被缓存。
问题:
我需要缓存一个包含表单的视图。问题是表单包含一个 AntiForgeryToken
,显然不应该被缓存。
一个明显的解决方案是使该表单成为 "donut hole",并通过 一个子动作。但是,它需要复杂的视图模型数据,并且子操作只接受原始类型作为参数,否则我会得到序列化错误。
解决这个问题的好方法是什么?
找到方法了。不确定它是否是最佳的,但它有效。
我没有将表单设为 "donut hole",而是将防伪标记本身设为甜甜圈洞。
[ChildActionOnly]
public virtual ContentResult GetAntiForgeryToken() {
using (var viewPage = new ViewPage()) {
var htmlHelper = new HtmlHelper(new ViewContext(), viewPage);
var token = htmlHelper.AntiForgeryToken();
return Content(token.ToHtmlString());
}
}
这需要创建一个虚拟的 HtmlHelper,然后手动创建令牌。