【问题标题】:Net Core: Use a Tag Helper in a Custom Tag Helper that returns Html?Net Core:在返回 Html 的自定义标签助手中使用标签助手?
【发布时间】:2019-07-05 23:00:16
【问题描述】:

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

Can I use a Tag Helper in a custom Tag Helper that returns 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)'

【问题讨论】:

  • link。几天前我回答了一个类似的问题。看看,让我知道它是否适合你,如果没有,我会帮助你更多。
  • 你能为我的问题写一个更具体的答案吗?如果可行,我可以发积分,谢谢,现在看你的回答
  • 我这么说的唯一原因是因为我现在在火车上,必须回家。但是,如果在此之前没有人回答,我将非常乐意提供帮助。
  • 对于收到的错误,我认为这是因为 HtmlString 类没有无参数构造函数,而您正在使用无参数构造函数构造对象(在声明 @ 987654327@)
  • @Ammar,TagHelperOutput() 构造函数采用委托而不是 HtmlString() 实例。

标签: c# asp.net-core .net-core asp.net-core-mvc tagbuilder


【解决方案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 属性,您需要动作名称,您需要将 ViewContext 提供给 AnchorTagHelper(否则会抛出错误),您不能将其作为依赖项注入。第 6-8 行解释说,您还需要 IHtmlGenerator,您只需要传递 AnchroTagHelper 构造函数。然后创建上下文 TagHelperOutput 和 TagHelperContext 以在您实例化的锚标记助手上调用 processAsync 方法。 (注意 - 我正在使用 GetAwaiter().GetResult() 因为在我的情况下此方法不是异步的,您完全可以将此代码放在 ProcessAsync 覆盖方法中)。所以我帮助解决了你的问题。我已经测试过了,它可以工作。

我的 cshtml 文件。 我的输出。

【讨论】:

  • 这个答案似乎比 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(),
  • 您能比较一下代码吗? Taylor Mullen 只为您提供了 Process 方法,这在当时(.net core 1.1)更简单。我已经为你提供了完整的解释。
  • TagHelperAttributeList 参数和在AnchorTagHelper 上显式设置值有什么区别?您似乎设置了两次相同的值?
猜你喜欢
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多