Кеширование в 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, а затем вручную создать токен.

Другие вопросы по тегам