Подтвердить что ты не робот

Могу ли я использовать помощник тега в специальном помощнике меток, который возвращает html?

Недавно я столкнулся с ситуацией, когда хотел бы использовать помощник тега в помощнике тега. Я огляделся и не мог найти кого-то другого, пытающегося это сделать, я использую плохое соглашение или мне не хватает документации?

Ex. Tag Helper Выводит HTML, содержащий другой помощник тега.

Ex.

[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());
    }
}

Есть ли способ обработать тег <a asp-action> </a> от С#? Или для обработки выходного HTML с помощью тегов-помощников?

4b9b3361

Ответ 1

Нет, вы не можете. TagHelpers - это функция времени разбора Razor.

Один из альтернатив - создание TagHelper и ручное обращение к процессу ProcessAsync/Process. Ака:

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);

Ответ 2

Я не знаю, работает ли это для вашего сценария, но можно наследовать от AnchorTagHelper, а затем выполнить ваши настройки, как это.

public class TestTagHelper : AnchorTagHelper
{
    public TestTagHelper(IHtmlGenerator htmlGenerator) : base(htmlGenerator) { }

    public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        // Replaces <test> with <a> tag
        output.TagName = "a"; 
        // do custom processing
        output.Attributes.SetAttribute("class", "custom-class");
        // let the base class generate the href 
        // note the base method may override your changes so it may be  
        // preferable to call it first instead of last.
        await base.ProcessAsync(context, output);
    }
}

Тогда вы можете просто использовать этот помощник тегов в своем представлении со всеми встроенными AnchorTagHelper по умолчанию.

<test asp-action="Index" asp-route-id="5"></test>

Ответ 3

Если кто-то хочет использовать встроенные помощники тегов из ядра asp.net, вы можете вместо этого использовать IHtmlGenerator. Для повторного использования других типов помощников тегов я не нашел более простой вариант, чем @N. Тейлор Маллен ответ

Вот как можно использовать помощник тега asp-action:

[HtmlTargetElement("helplink")]
public class RazorTagHelper : TagHelper
{
    private readonly IHtmlGenerator _htmlGenerator;

    public RazorTagHelper(IHtmlGenerator htmlGenerator)
    {
        _htmlGenerator = htmlGenerator;
    }

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

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.TagMode = TagMode.StartTagAndEndTag;
        var actionAnchor = _htmlGenerator.GenerateActionLink(
            ViewContext,
            linkText: "Home",
            actionName: "Index",
            controllerName: null,
            fragment: null,
            hostname: null,
            htmlAttributes: null,
            protocol: null,
            routeValues: null
            );
        var builder = new HtmlContentBuilder();
        builder.AppendHtml("Here the link: ");
        builder.AppendHtml(actionAnchor);
        output.Content.SetHtmlContent(builder);
    }
}