2015-05-21 9 views
2

Я занимаюсь кешированием пончиков с помощью библиотеки MVCDonutCaching.Кэширование в ASP.NET MVC с непривилегированными формами

Предыстория кэширования пончик с использованием этой библиотеки:
Как это работает, что вы можете кэшировать представление, но исключить его часть из кэширования, то есть «отверстие пончика». Вы делаете это, имея непонятный материал как частичный вид, который отображается дочерним действием. Затем в представлении вы вызываете это дочернее действие Html.RenderAction(.... Таким образом будет кэшировано все, кроме этого дочернего действия.

Проблема:
Мне нужно кэшировать вид, который содержит форму. Проблема заключается в том, что форма включает AntiForgeryToken, который, очевидно, не должен кэшироваться.

Очевидное решение состоит в том, чтобы сделать эту форму «отверстием пончика» и сделать ее посредством дочернего действия. Но ему нужны сложные данные в виде viewmodel, а дочерние действия ony принимают примитивные типы в качестве аргументов, иначе я получаю ошибки сериализации.

Что хорошего в этом отношении?

+0

Один из способов - создать форму представления формы в дочернем действии. Но мне не нравится этот параметр, так как форма требует большого количества данных, и я хочу, чтобы он был кэширован с остальной частью представления. –

ответ

2

Обнаружен способ. Не уверен, оптимален ли он, но он работает.

Вместо того чтобы сделать форму «отверстие пончика», я делаю анти-поддельный токен сам пончик.

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