gpt4 book ai didi

asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelpers

转载 作者:行者123 更新时间:2023-12-02 04:25:50 25 4
gpt4 key购买 nike

ASP.NET Core TagHelper documentation给出以下示例:

public class WebsiteContext
{
public Version Version { get; set; }
public int CopyrightYear { get; set; }
public bool Approved { get; set; }
public int TagsToShow { get; set; }
}

[TargetElement("website-information")]
public class WebsiteInformationTagHelper : TagHelper
{
public WebsiteContext Info { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "section";
output.Content.SetContent(
$@"<ul><li><strong>Version:</strong> {Info.Version}</li>
<li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li>
<li><strong>Approved:</strong> {Info.Approved}</li>
<li><strong>Number of tags to show:</strong> {Info.TagsToShow}</li></ul>");
output.TagMode = TagMode.StartTagAndEndTag;
}
}

然后可以在 Razor .cshtml 中使用它,如下所示:

<website-information info="new WebsiteContext {
Version = new Version(1, 3),
CopyrightYear = 1790,
Approved = true,
TagsToShow = 131 }"/>

这将生成以下 HTML:

<section>
<ul>
<li><strong>Version:</strong> 1.3</li>
<li><strong>Copyright Year:</strong> 1790</li>
<li><strong>Approved:</strong> true</li>
<li><strong>Number of tags to show:</strong> 131 </li>
</ul>
</section>

这是非常丑陋的标签助手语法。有没有办法嵌套另一个标签助手并获得完整的智能感知,以便网站信息唯一允许的子级可以是上下文?请参阅下面的示例:

<website-information>
<context version="1.3" copyright="1790" approved tags-to-show="131"/>
</website-information>

在我的用例中,网站信息元素已经具有许多属性,我想添加一个或多个单独的嵌套元素。

更新

我已经筹集了this ASP.NET GitHub 页面上的建议为 TagHelpers 实现此功能。

最佳答案

您当然可以嵌套标签助手,尽管 View 组件、部分 View 或显示模板等其他选项可能更适合OP描述的场景。

这可能是一个非常简单的标签助手:

[HtmlTargetElement("child-tag", ParentTag="parent-tag")]
public class ChildTagHelper : TagHelper
{
public string Message { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
// Create parent div
output.TagName = "span";
output.Content.SetContent(Message);
output.TagMode = TagMode.StartTagAndEndTag;
}
}

这也可能是另一个简单的标签助手:

[HtmlTargetElement("parent-tag")]
[RestrictChildren("child-tag")]
public class ParentTagHelper: TagHelper
{
public string Title { get; set; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";

// Add some specific parent helper html
var header = new TagBuilder("h1");
header.Attributes.Add("class", "parent-title");
header.InnerHtml.Append(this.Title);
output.PreContent.SetContent(header);

// Set the inner contents of this helper(Will process any nested tag helpers or any other piece of razor code)
output.Content.SetContent(await output.GetChildContentAsync());
}
}

在 Razor View 中,您可以编写以下内容:

<parent-tag title="My Title">
<child-tag message="This is the nested tag helper" />
</parent-tag>

将呈现为:

<div>
<h1 class="parent-title">My Title</h1>
<span>This is the nested tag helper</span>
</div>

您可以可选强制标签助手以特定方式嵌套:

  • 在父标签助手中使用 [RestrictChildren("child-tag", "another-tag")] 来限制允许的嵌套标签助手
  • 在声明子标记助手时使用 ParentTag 参数强制将标记嵌套在特定父标记内 [HtmlTargetElement("child-tag", ParentTag = "parent-tag")]

关于asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelpers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32692857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com