我正在使用 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/