【问题标题】:Caching in ASP.NET MVC with uncachable forms在 ASP.NET MVC 中使用不可缓存的表单进行缓存
【发布时间】:2015-08-02 20:50:08
【问题描述】:

我正在使用MVCDonutCaching 库进行甜甜圈缓存。

使用此库进行甜甜圈缓存的背景
它的工作方式是,您可以缓存视图,但将其中的一部分排除在缓存之外,即“甜甜圈洞”。您可以通过将不可缓存的内容作为部分视图来实现此目的,该部分视图由子操作呈现。然后在视图中,您将该子操作称为Html.RenderAction(...。这样,除了子操作之外的所有内容都将被缓存。

问题
我需要缓存一个包含表单的视图。问题是表单包含一个AntiForgeryToken,显然不应该缓存它。

一个明显的解决方案是把它做成一个“甜甜圈洞”,然后通过 一个子动作。但是,它需要复杂的视图模型数据,并且子操作只接受原始类型作为参数,否则会出现序列化错误。

有什么好办法解决这个问题?

【问题讨论】:

  • 一种方法是在子操作中创建表单的视图模型。但我不喜欢这个选项,因为表单需要获取大量数据,所以我希望它与视图的其余部分一起缓存。

标签: asp.net asp.net-mvc caching donut-caching child-actions


【解决方案1】:

找到了方法。不确定它是否是最佳的,但它可以工作。

我没有将表单设为“甜甜圈洞”,而是将防伪令牌本身设为甜甜圈洞。

[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,然后手动创建令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多