2016-07-11 13 views
1

this articleによれば、複数のタグヘルパー(同じタグを対象とする)を使用する場合は、await output.GetChildContentAsync()を使用して、キャッシュされた出力に関する問題:TagHelper GetChildContentAsync()とContent.GetContent()を呼び出して出力をキャッシュする

タグヘルパーの出力がキャッシュされ、WWWタグヘルパーが実行されると、HTTPタグヘルパーのキャッシュ出力が上書きされるという問題があります。

問題は同様の文を使用して固定されている:

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

この現象の説明:

コンテンツが変更されているかどうかをチェックし、上記のコード、および場合 それはそれは、出力バッファからコンテンツを取得します。

質問は以下のとおりです。
1)フードの下TagHelperOutput.GetChildContentAsync()TagHelperOutput.Content.GetContent() beetween違いは何ですか?
2)結果をバッファに書き込む方法は?
3)「キャッシュされた出力」とは何ですか?ASP.NET MVC Coreは、TagHelper呼び出しの結果、初期のかみそりのマークアップまたはhtmlのマークアップをキャッシュしますか?

ありがとうございます!私は答えに来ているソースコードのいくつかの分析の後

答えて

1


違いは次のとおりです。
- 子どもたちにTagHelpersを実行し、TagHelperContentその結果生成TagHelperOutput.GetChildContentAsync()方法。このオブジェクトから、呼び出された内部TagHelpersの結果としてHTMLマークアップを受け取ることができ、現在のTagHelper結果としてそれをさらに使用することができます。また、このメソッドは、内部のTagHelperContentsをレンダリングする子供のTasksをキャッシュします。
同じ要素のスコープ内でこのメソッドを呼び出すと、(キャッシュから)同じ結果が得られます。
- メソッドTagHelperOutput.Content.GetContent()は、TagHelperOutput.GetChildContentAsync()の呼び出しでバッファリングされた結果からhtmlマークアップを返します。つまり、最初のTagHelperでTagHelperOutput.GetChildContentAsync()メソッドを呼び出さないと、string.Emptyという結果が返されます。

コードサンプル:
1)TagHelperOutput.GetChildContentAsync()が呼び出されていないので、このヘルパーは、string.Empty結果を生成します:

 public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
    { 
     var childContent = (await output.GetChildContentAsync()).GetContent(); 

     output.Content.SetHtmlContent(Regex.Replace(
      childContent, 
      @"\b(?:https?://)(\S+)\b", 
      "<a target=\"_blank\" href=\"$0\">$0</a>" 
     )); 
    } 

[HtmlTargetElement("p")] 
    public class AutoLinkerHttpTagHelper : TagHelper 
    { 
     public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
     { 
      var childContent = output.Content.GetContent(); 

      output.Content.SetHtmlContent(Regex.Replace(
       childContent, 
       @"\b(?:https?://)(\S+)\b", 
       "<a target=\"_blank\" href=\"$0\">$0</a>" 
      )); 
     } 
    } 

    [HtmlTargetElement("p")] 
    public class AutoLinkerWwwTagHelper : TagHelper 
    { 
     public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
     { 
      var childContentBySync = output.Content.GetContent(); 

      output.Content.SetHtmlContent(Regex.Replace(
       childContentBySync, 
       @"\b(www\.)(\S+)\b", 
       "<a target=\"_blank\" href=\"http://$0\">$0</a>")); 
     } 
    } 

2私たちは、このような第1のヘルパーのProcessAsync方法を変更した場合)

結果は正常です。

そして、これは出力結果のためのいくつかの保険です:

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

別の言葉GetChildContentAsync()が呼び出された場合、我々は確認してください。

誰かを助けることを願っています。

関連する問題