Кеширование в ASP.NET MVC с не кэшируемыми формами
Я делаю кэширование пончиков с библиотекой MVCDonutCaching.
Предыстория кеширования пончиков с использованием этой библиотеки:
То, как это работает, заключается в том, что вы можете кэшировать представление, но исключить его часть из кэширования, то есть "дыру от бублика". Вы делаете это, имея некэшируемый материал как частичное представление, которое отображается дочерним действием. Затем в представлении вы называете это дочернее действие Html.RenderAction(...
, Таким образом, все, кроме этого дочернего действия, будет кэшировано.
Проблема:
Мне нужно кэшировать представление, которое содержит форму. Проблема в том, что форма включает в себя AntiForgeryToken
, который, очевидно, не должен быть кэширован.
Очевидное решение состоит в том, чтобы создать эту "дырочку для пончиков" и визуализировать ее с помощью дочернего действия. Но ему нужны сложные данные модели представления, и дочерние действия принимают только примитивные типы в качестве аргументов, в противном случае я получаю ошибки сериализации.
Какой хороший способ обойти это?
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, а затем вручную создать токен.