:
違いは次のとおりです。
- 子どもたちに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()
が呼び出された場合、我々は確認してください。
誰かを助けることを願っています。