TagHelper кэширует выходные данные, вызывая GetChildContentAsync() и Content.GetContent().

Согласно этой статье если мы используем несколько хелперов тегов (нацеленных на один и тот же тег) и в каждом из них мы будем использовать await output.GetChildContentAsync() для получения html-контента, мы придем к проблеме с кешированием вывода:

Проблема заключается в том, что выходные данные помощника тега кэшируются, и когда помощник тега WWW запускается, он перезаписывает кэшированный вывод помощника тега HTTP.

Проблема устраняется с помощью оператора вроде:

   var childContent = output.Content.IsModified ? output.Content.GetContent() : 
                (await output.GetChildContentAsync()).GetContent();

Описание этого поведения:

Приведенный выше код проверяет, было ли изменено содержимое, и если да, то получает содержимое из выходного буфера.

Вопросы:
1) В чем разница между TagHelperOutput.GetChildContentAsync() и TagHelperOutput.Content.GetContent() под капотом?
2) Какой метод записывает результат в буфер?
3) Что означает "кэшированный вывод": ASP.NET MVC Core кэширует исходную разметку бритвы или разметку html в результате вызова TagHelper?

Заранее спасибо!


person malonowa    schedule 11.07.2016    source источник


Ответы (1)


Объяснение другого ответа было для меня неясным, поэтому я проверил его, и вот резюме:

  • await output.GetChildContentAsync(); ⇒ получает исходный контент внутри тега, который жестко запрограммирован в файле Razor. обратите внимание, что он будет кэширован при первом вызове и никогда не изменится при последующих вызовах, поэтому он не отражает изменения, сделанные другими TagHelper во время выполнения!

  • output.Content.GetContent(); ⇒ следует использовать только для получения содержимого, измененного некоторым TagHelper, в противном случае возвращается значение Empty!

Примеры использования:

Получение последнего контента (будь то исходная бритва или контент, измененный другими помощниками тегов):

var curContent = output.IsContentModified ? output.Content : await output.GetChildContentAsync();
string strContent = curContent.GetContent();
person S.Serpooshan    schedule 09.03.2019
comment
@jerrythomas Это работает для .net core 2.2, я проверял! - person S.Serpooshan; 21.07.2019