J'ai récemment rencontré une situation dans laquelle j'aimerais utiliser un assistant de tag dans un assistant de tag. J'ai regardé autour de moi et je n'ai trouvé personne d'autre qui essaie de faire cela. Est-ce que j'utilise une mauvaise convention ou est-ce que je manque de documentation?
Ex. Tag Helper A génère un HTML contenant un autre tag helper.
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());
}
}
Est-il possible pour moi de traiter l'assistant de balise <a asp-action> </a>
à partir de C #? Ou pour retraiter le code HTML de sortie avec des aides de balises?
Non vous ne pouvez pas. TagHelpers est une fonctionnalité de temps d'analyse Razor.
Une alternative consiste à créer un TagHelper et à appeler manuellement sa méthode ProcessAsync/Process. Alias:
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);
Je ne sais pas si cela fonctionne pour votre scénario, mais il est possible d'hériter de AnchorTagHelper, puis d'effectuer vos personnalisations comme ceci.
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
base.ProcessAsync(context, output);
}
}
Ensuite, vous pouvez simplement utiliser cette aide de balise dans votre vue avec toute la qualité intégrée de la valeur par défaut AnchorTagHelper
.
<test asp-action="Index" asp-route-id="5"></test>
Si quelqu'un cherche à réutiliser les aides de balises intégrées à partir d'asp.net core, vous pouvez utiliser IHtmlGenerator à la place. Pour réutiliser d'autres types d'auxiliaires de tag, je n'ai pas trouvé d'option plus simple que @N. Taylor Mullen répondre
Voici comment réutiliser l'assistant de balise 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's the link: ");
builder.AppendHtml(actionAnchor);
output.Content.SetHtmlContent(builder);
}
}