繁体   English   中英

Net Core:在返回HTML的自定义标签助手中使用标签助手吗?

[英]Net Core: Use a Tag Helper in a Custom Tag Helper that returns Html?

我正在尝试进行此问题,.Net Core 2中除外。

我可以在返回html的自定义Tag Helper中使用Tag Helper吗?

“我想在标签帮助器中使用标签帮助器。我环顾四周,找不到其他人尝试这样做,我使用的约定不当还是缺少文档?

例如 标记助手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)'

现在,这已成为我最喜欢的问题之一。 幸运的是,我已经处理了足够的标签助手。 这是代码。

[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属性,您需要操作名称,需要将ViewContext提供给AnchorTagHelper(否则将引发错误),您不能将其作为依赖项注入。 第6-8行说明了这一点,您还需要IHtmlGenerator,您只需要传递AnchroTagHelper构造函数即可。 然后,创建在实例化的定位标记帮助程序上调用processAsync方法所需的上下文TagHelperOutput和TagHelperContext。 (注意-我正在使用GetAwaiter()。GetResult(),因为在我的情况下此方法不是异步的,您可以将这段代码完全放在ProcessAsync重写的方法中)。 因此,我帮助您解决了问题。 我已经对其进行了测试,并且可以正常工作。

我的cshtml文件。 在此处输入图片说明 我的输出。

这是输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM