gpt4 book ai didi

asp.net-core-mvc - MVC6 TagHelpers 一次性

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

在较旧的 MVC HTML 帮助程序中,可以使用 IDisposable 来包装内容 - 例如 BeginForm 帮助程序会自动包装 *stuff*带有结束 form 标记

<% using (Html.BeginForm()) {%>
*stuff*
<% } %>

MVC6 TagHelpers 支持这种内容包装吗?例如我想要这个

<widget-box title="My Title">Yay for content!</widget-box>

扩展为带有包装div的引导小部件框:

<div class="widget-box">
<div class="widget-header">
<h4 class="widget-title">My Title</h4>
</div>
<div class="widget-body">
<div class="widget-main">
Yay for content!
</div>
</div>
</div>

这可以通过 TagHelpers 实现吗?

解决方案:我已将 @DanielJG 的答案烘焙为 working demo on github消耗 WidgetBoxTagHelper.cs (将与 Beta/RC/RTM 保持同步,因为我在生产应用程序中使用该库)

最佳答案

标签助手必须实现接口(interface)ITagHelper(正如@NTaylorMullen所指出的,TagHelper类只是一个您可以使用的便利类实现它时),这会强制您使用 ProcessProcessAsync 方法,因此您不能依赖在 Dispose 方法中添加内容。

但是,您可以完全控制输出内容,以便您可以根据需要替换/修改它。例如,您的小部件标签助手的快速近似(使用框架的 1.0 版本):

[HtmlTargetElement("widget-box")]
public class WidgetTagHelper : TagHelper
{
public string Title { get; set; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var outerTag = new TagBuilder("div");
outerTag.Attributes.Add("class", output.TagName);
output.MergeAttributes(outerTag);
output.TagName = outerTag.TagName;

//Create the header
var header = new TagBuilder("div");
header.Attributes.Add("class", "widget-header");
header.InnerHtml.Append(this.Title);
output.PreContent.SetHtmlContent(header);

//Create the body and replace original tag helper content
var body = new TagBuilder("div");
body.Attributes.Add("class", "widget-body");
var originalContents = await output.GetChildContentAsync();
body.InnerHtml.Append(originalContents.GetContent());
output.Content.SetHtmlContent(body);
}
}

在您的 Razor 中,您将拥有:

<widget-box title="My Title">Yay for content!</widget-box>

将呈现为:

<div class="widget-box">
<div class="widget-header">My Title</div>
<div class="widget-body">Yay for content!</div>
</div>

不要忘记通过将 @addTagHelper 指令添加到 _ViewImports.cshtml 文件中来注册程序集中的标记助手。例如,这将在我的应用程序中注册所有助手:

@addTagHelper *, WebApplication2

旧 beta7 代码

  • 在 beta7 中,您必须使用 [TargetElement] 属性。
  • TagBuilder 类有一个 SetInnerText 方法,您可以使用它来将其上下文设置为文本。

代码如下:

[TargetElement("widget-box")]
public class WidgetTagHelper : TagHelper
{
private IHtmlEncoder encoder;
public WidgetTagHelper(IHtmlEncoder encoder)
{
this.encoder = encoder;
}

public string Title { get; set; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var outerTag = new TagBuilder("div");
outerTag.Attributes.Add("class", output.TagName);
output.MergeAttributes(outerTag);
output.TagName = outerTag.TagName;

//Create the header
var header = new TagBuilder("div");
header.Attributes.Add("class", "widget-header");
header.SetInnerText(this.Title);
output.PreContent.SetContent(header);

//Create the body and replace original tag helper content
var body = new TagBuilder("div");
body.Attributes.Add("class", "widget-body");
var originalContents = await context.GetChildContentAsync();
using (var writer = new StringWriter())
{
body.TagRenderMode = TagRenderMode.StartTag;
body.WriteTo(writer, encoder);
originalContents.WriteTo(writer, encoder);
body.TagRenderMode = TagRenderMode.EndTag;
body.WriteTo(writer, encoder);
output.Content.SetContent(writer.ToString());
}
}
}

旧 beta5 代码

  • 标签助手中有一个 InnerHtml 属性。
  • 标签助手中有一个 ToHtmlString 方法,用于将它们呈现为 html。

代码如下:

[TargetElement("widget-box")]
public class WidgetTagHelper: TagHelper
{
public string Title { get; set; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var outerTag = new TagBuilder("div");
outerTag.Attributes.Add("class", output.TagName);
output.MergeAttributes(outerTag);
output.TagName = outerTag.TagName;

//Create the header
var header = new TagBuilder("div");
header.Attributes.Add("class", "widget-header");
header.InnerHtml = this.Title;
output.PreContent.SetContent(header.ToHtmlString(TagRenderMode.Normal).ToString());

//Create the body and replace original tag helper content
var body = new TagBuilder("div");
body.Attributes.Add("class", "widget-body");
var originalContents = await context.GetChildContentAsync();
body.InnerHtml = originalContents.GetContent();
output.Content.SetContent(body.ToHtmlString(TagRenderMode.Normal).ToString());
}
}

关于asp.net-core-mvc - MVC6 TagHelpers 一次性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553298/

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