使用不可缓存的形式在 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,然后手动创建令牌。