4

.Net Core 2 以外でこの質問をしようとしています。

HTML を返すカスタム タグ ヘルパーでタグ ヘルパーを使用できますか?

" タグ ヘルパー内でタグ ヘルパーを使用したいと考えています。周りを見回しても、これを試みている人を見つけることができませんでした。私の使用している慣習が悪いのでしょうか、それともドキュメントが不足しているのでしょうか?

元。タグ ヘルパー A は、別のタグ ヘルパーを含む HTML を出力します。

以下のコンパイルエラーを解決するにはどうすればよいですか?

[HtmlTargetElement("tag-name")]
public class RazorTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<a asp-action=\"Home\" ");
        output.Content.SetHtmlContent(sb.ToString());
    }
}

C# からタグ ヘルパーを処理する方法はありますか? または、タグ ヘルパーを使用して出力 HTML を再処理しますか? "

Taylor Mullen によるこのマーク付きのソリューションを試してみました。

var anchorTagHelper = new AnchorTagHelper
{
    Action = "Home",
};

var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(), (useCachedResult, encoder) => new HtmlString());
var anchorContext = new TagHelperContext(
    new TagHelperAttributeList(new[] { new TagHelperAttribute("asp-action", new HtmlString("Home")) }),
    new Dictionary<object, object>(),
    Guid.NewGuid());
await anchorTagHelper.ProcessAsync(anchorContext, anchorOutput);
output.Content.SetHtmlContent(anchorOutput);

以下の受信エラー

There is no argument given that corresponds to the required formal parameter 'value' of 'HtmlString.HtmlString(string)'
4

1 に答える 1

1

これは、ここでの私のお気に入りの質問の 1 つです。ありがたいことに、タグヘルパーを十分に扱ってきました。これがコードです。

[HtmlTargetElement(ParentAnchorTag)]
public class ParentActionTagHelper : TagHelper
{
    private const string ParentAnchorTag = "p-a";

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext viewContext { get; set; }

    private readonly IHtmlGenerator _htmlGenerator;

    public ParentActionTagHelper(IHtmlGenerator htmlGenerator)
    {
        _htmlGenerator = htmlGenerator;
    }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";

        var anchorTagHelper = new AnchorTagHelper(_htmlGenerator)
        {
            Action = "Privacy",
            ViewContext = viewContext,

        };
        var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(),
            (useCachedResult, encoder) =>  Task.Factory.StartNew<TagHelperContent>(
                 () => new DefaultTagHelperContent()));
        anchorOutput.Content.AppendHtml("Privacy Link");
        var anchorContext = new TagHelperContext(
            new TagHelperAttributeList(new[]
            {
                new TagHelperAttribute("asp-action", new HtmlString("Privacy"))
            }),
                new Dictionary<object, object>(),
                Guid.NewGuid().ToString());

        anchorTagHelper.ProcessAsync(anchorContext, anchorOutput).GetAwaiter().GetResult();
        output.Content.SetHtmlContent(anchorOutput);
    }
}

まず、アクション名を使用して href 属性を生成するには、アクション名が必要です。AnchorTagHelper に ViewContext を提供する必要があります (それ以外の場合はエラーがスローされます)。それを依存関係として注入することはできません。行 6 ~ 8 は、AnchroTagHelper コンストラクターのみを渡す必要がある IHtmlGenerator も必要であることを説明しています。次に、インスタンス化したアンカー タグ ヘルパーで processAsync メソッドを呼び出すために必要なコンテキスト TagHelperOutput と TagHelperContext を作成します。(注 - GetAwaiter().GetResult() を使用しています。私の場合、このメソッドは非同期ではないため、このコードを完全に ProcessAsync オーバーライド メソッドに入れることができます)。だから私はこれがあなたの問題を解決するのを手伝います. 私はそれをテストしましたが、動作します。

私のcshtmlファイル。 ここに画像の説明を入力 私の出力。

これが出力です

于 2019-07-06T00:33:01.527 に答える