2016-07-11 13 views
1

Nach this article, wenn wir mehrere Tag-Helfer (zielgerichtet auf das gleiche Tag) verwenden und in jedem von ihnen werden wir await output.GetChildContentAsync() verwenden HTML-Inhalt erhalten, die wir kommen das Problem mit der gecachten Ausgabe:TagHelper zwischengespeichert Ausgabe durch Aufruf von GetChildContentAsync() und Content.GetContent()

Das Problem ist, dass die Tag-Helper-Ausgabe zwischengespeichert wird, und wenn der WWW-Tag-Helfer ausgeführt wird, überschreibt es die zwischengespeicherte Ausgabe von dem HTTP-Tag-Helfer.

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

Beschreibung dieses Verhaltens:

Das Problem durch die Verwendung Aussage wie fixiert ist

Der obige Code überprüft, ob der Inhalt geändert wurde, und es, wenn hat, bekommt es den Inhalt aus dem Ausgabepuffer.

Die Fragen sind:
1) Was ist der Unterschied beetween TagHelperOutput.GetChildContentAsync() und TagHelperOutput.Content.GetContent() unter der Haube?
2) Welche Methode schreibt das Ergebnis in den Puffer?
3) Was bedeutet es "im Cache gespeicherte Ausgabe": ASP.NET MVC Core Caches erste Rasierer Markup oder HTML Markup als Ergebnis von TagHelper aufrufen?

Vielen Dank im Voraus!

Antwort

1

Nach einiger Analyse des Quellcodes kam ich habe die Antwort ein:
Unterschied ist:
- Methode TagHelperOutput.GetChildContentAsync() führt TagHelpers Kinder und als TagHelperContent Ergebnis. Von diesem Objekt können wir HTML-Markup als Ergebnis von aufgerufenen inneren TagHelpern erhalten und es weiter wie für das aktuelle TagHelper-Ergebnis verwenden. Auch diese Methode speichert Kinder Tasks, die innere TagHelperContents rendern.
Das Aufrufen dieser Methode im Bereich desselben Elements führt zu demselben Ergebnis (aus dem Cache).
- Methode TagHelperOutput.Content.GetContent() gibt HTML-Markup aus gepufferten Ergebnissen aus dem Aufruf von TagHelperOutput.GetChildContentAsync() zurück. Dies bedeutet, dass, wenn wir TagHelperOutput.GetChildContentAsync() Methode im ersten TagHelper nicht aufrufen, erhalten wir string.Empty Ergebnis.

Codebeispiele:
1) Diese Helfer string.Empty Ergebnis produzieren wird, weil TagHelperOutput.GetChildContentAsync() nicht aufgerufen wird:

[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) Wenn wir ProcessAsync Verfahren des ersten Helfer wie folgt zu ändern:

 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>" 
     )); 
    } 

Das Ergebnis wird gut sein.

Und das ist eine Versicherung für die Ausgabe Ergebnis:

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

anderen Worten, wir überprüfen, ob GetChildContentAsync() aufgerufen wurde.

Ich hoffe, es wird jemandem helfen.