gpt4 book ai didi

asp.net-mvc - 针对同一元素的多个标签助手

转载 作者:行者123 更新时间:2023-12-02 03:51:54 26 4
gpt4 key购买 nike

我刚刚注意到,如果我有 2 个针对同一元素的标签助手,则两者都可以执行。它们的执行顺序取决于它们在 _ViewImports.cshtml 中注册的顺序。

例如,我可以为 anchor 元素创建另一个标签助手:

[HtmlTargetElement("a", Attributes = "foo")]
public class FooTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//Get the url from href attribute generated in the default AnchorTagHelper
var url = output.Attributes["href"].Value.ToString();

...
}
}

按如下方式使用它(请注意,我还添加了默认 anchor 帮助器的属性,例如 asp-controller):

<a class="menu" asp-controller="Home" asp-action="Index" foo>Foo</a>

如果此帮助程序在 _ViewImports.cshtml 之后默认 ASP 注册:

  • 每当调用 Process 时,TagHelperOutput 就已经包含默认生成的 href AnchorTagHelper 。我还可以以任何我喜欢的方式更新默认标签助手生成的 anchor 。

对这种行为有一定程度的控制吗?

您可能想要决定是否执行针对同一元素的更多帮助程序(就像密封您的输出一样)。您可能还想允许其他帮助程序,但请确保某些属性未被修改。

最佳答案

覆盖只读属性顺序,如下所示:

[HtmlTargetElement("a", Attributes = "foo")]
public class FooTagHelper : TagHelper
{
// This should be the last tag helper on any tag to run
public override int Order => int.MaxValue;

public override async Task ProcessAsync(TagHelperContext context,
TagHelperOutput output)
{
//...
}
}

阅读TagHelperRunner的源代码类中,我意识到相同的 TagHelperContextTagHelperOutput 将为同一元素找到的所有标记助手共享,这些标记助手将由 ITagHelper 排序处理。订购 属性。

因此,您可以通过为 Order 属性分配适当的值来控制它们的执行顺序。作为引用,这是 TagHaelperRunner.RunAsync 方法:

public async Task<TagHelperOutput> RunAsync([NotNull] TagHelperExecutionContext executionContext)
{
var tagHelperContext = new TagHelperContext(
executionContext.AllAttributes,
executionContext.Items,
executionContext.UniqueId,
executionContext.GetChildContentAsync);
var tagHelperOutput = new TagHelperOutput(
executionContext.TagName,
executionContext.HTMLAttributes)
{
SelfClosing = executionContext.SelfClosing,
};
var orderedTagHelpers = executionContext.TagHelpers.OrderBy(tagHelper => tagHelper.Order);

foreach (var tagHelper in orderedTagHelpers)
{
await tagHelper.ProcessAsync(tagHelperContext, tagHelperOutput);
}

return tagHelperOutput;
}

到目前为止,我还发现可以查询 TagHelperOutput 中的一些属性检查先前的标签助手是否修改了输出。尽管您无法知 Prop 有更高顺序的标签助手(在您的标签助手之后执行)是否修改了输出:

  • TagHelperOutput.IsContentModified 仅当内容被修改时才会返回 true(当属性或 PreElementPreContentPostElementPostContent 已修改)

  • TagHelperOutput.PreElement.IsModified 以及类似的 PreContentPostElementPostContent 将返回 true当这些被修改时。

  • 可以通过调用 TagHelperOutput.Content.Clear() 以及类似的 Pre/Post Element/Context 属性来删除先前标签助手设置的内容。

  • 通过调用 TagHelperOutput.SuppressOutput() 可以完全抑制内容,该方法会调用清除每个属性并将 TagName 设置为 null。如果您希望标签助手渲染某些内容,则需要再次分配它们。

最后,如果您必须在同一元素的多个标签助手之间共享一些数据,则可以使用 TagHelperContext.Items 字典。

关于asp.net-mvc - 针对同一元素的多个标签助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32922425/

26 4 0