asp.net - 在 ASP.NET MVC 中使用不可缓存的表单进行缓存

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

我正在使用 MVCDonutCaching 进行 donut 缓存图书馆。

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

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

一个明显的解决方案是使其形成一个“ donut 洞”,并通过 一个 child 的 Action 。但是,它需要复杂的 View 模型数据,并且子操作仅接受原始类型作为参数,否则我会收到序列化错误。

有什么好的方法可以解决这个问题吗?

最佳答案

找到办法了。不确定它是否是最佳的,但它确实有效。

我没有将表单设为“ donut 孔”,而是将防伪标记本身设为 donut 孔。

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

关于asp.net - 在 ASP.NET MVC 中使用不可缓存的表单进行缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30369451/

相关文章:

c - 使用填充防止虚假共享

r - 试图将 R 环境中的所有内容保存到磁盘

必须需要 ASP.NET 服务器控件属性属性

.net - 部署到服务器上的 IIS 后,Rotativa pdf 无法工作

c# - 将水平 ListView 限制在屏幕内的空间?

c# - ASP.NET MVC 5 异步上下文管理

css - ASP.NET MVC 的动态 CSS?

javascript - Node : Is calling functions from require's cache as fast as functions in global scope?

c# - 如何在不实例化对象或没有静态方法的情况下获取类的名称?

c# - 从 GridView 中删除记录时出错