除了.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)'
答案 0 :(得分:0)
现在,这是我在这里最喜欢的问题之一。幸运的是,我已经处理了足够的标签助手。这是代码。
[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重写的方法中)。因此,我帮助您解决了问题。我已经对其进行了测试,并且可以正常工作。