asp.net-core - ASP.NET Core- 有没有办法使用自定义标签助手呈现一组元素?

标签 asp.net-core tag-helpers asp.net-core-tag-helpers

我注意到在我的项目中,我的所有表单字段都遵循相同的模式。一个典型的例子是:

<div class="col-x-x">
  <label asp-for="Property"></label>
  <span message="description">
  <input asp-for="Property" />
  <span asp-validation-for="Property"></span>
</div>

我很想用某种方式对这段代码进行分组,这样我就可以简单地将模型上的属性传递给它,并输出正确的 HTML。例如。:
<form-field for="Property" ...>

或者
@Html.StringFormField(...)

我遇到的问题是,无论我尝试什么方法,输出的 html 都是上面的原始 html,而不是从标签助手生成的 html。这两种方法我都试过了,都没有成功。此外,我尝试创建一个 razor 函数,但我所有的尝试都无法编译,而且我无法使局部 View 工作,因为在将字符串传递给 a 后,我无法找到获取属性信息的方法看法。

我最近的尝试是使用标签助手,但这有前面提到的相同问题。最新版本的代码如下:
[HtmlTargetElement("form-field", Attributes = "for")]
public class FormFieldTagHelper : TagHelper
{
    [HtmlAttributeName("for")]
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.TagMode = TagMode.StartTagAndEndTag;

        var contentBuilder = new HtmlContentBuilder();

        contentBuilder.AppendHtmlLine($"<label asp-for=\"{For}\"></label>");
        contentBuilder.AppendHtmlLine($"<span message=\"description.\"></span>");
        contentBuilder.AppendHtmlLine($"<input asp-for=\"{For}\"/>");
        contentBuilder.AppendHtmlLine($"<span asp-validation-for=\"{For}\"/></span>");

        output.Content.SetHtmlContent(contentBuilder);
    }
}

有一个问题解决了这个问题( with no solution ),这表明导入的顺序是一个潜在的问题,所以我的导入如下:
@addTagHelper Project.Web.Features.Shared.*, Project.Web
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

欢迎任何解决方案,无论是标签助手还是其他方法。

最佳答案

您可以使用 IHtmlGenerator要生成这些元素,请引用我下面的演示代码:

[HtmlTargetElement("form-field", Attributes = "for")]
public class FormFieldTagHelper : TagHelper
{
    [HtmlAttributeName("for")]
    public ModelExpression For { get; set; }

    private readonly IHtmlGenerator _generator;

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

    public FormFieldTagHelper(IHtmlGenerator generator)
    {
        _generator = generator;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        using (var writer = new StringWriter())
        {
            writer.Write(@"<div class=""form-group"">");

            var label = _generator.GenerateLabel(
                            ViewContext,
                            For.ModelExplorer,
                            For.Name, null,
                            new { @class = "control-label" });

            label.WriteTo(writer, NullHtmlEncoder.Default);
            writer.Write(@"<span message=""description.""></span>");

            var textArea = _generator.GenerateTextBox(ViewContext,
                                For.ModelExplorer,
                                For.Name,
                                For.Model,
                                null,
                                new { @class = "form-control" });

            textArea.WriteTo(writer, NullHtmlEncoder.Default);

            var validationMsg = _generator.GenerateValidationMessage(
                                    ViewContext,
                                    For.ModelExplorer,
                                    For.Name,
                                    null,
                                    ViewContext.ValidationMessageElement,
                                    new { @class = "text-danger" });

            validationMsg.WriteTo(writer, NullHtmlEncoder.Default);

            writer.Write(@"</div>");

            output.Content.SetHtmlContent(writer.ToString());

        }
    }
}

看法:
 <form-field for="ManagerName"></form-field>

结果:

enter image description here

关于asp.net-core - ASP.NET Core- 有没有办法使用自定义标签助手呈现一组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59796404/

相关文章:

jQuery 在 ASP.NET Core 2.2 Razor View 中不可用

c# - ASP.NET Core DI 构造函数与 RequestServices

c# - 如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?

asp.net-core - 如何从 Nuget 更新中锁定包版本

asp.net-mvc - ntext 属性的 ASP.NET MVC textarea 标签助手不起作用

asp.net-mvc - VS 2015 中禁用的标签助手

asp.net - 将QueryString附加到asp.net核心 anchor 帮助器标签中的href

c# - 在标签助手中进行上下文关联

asp.net-core - .NET Core 必填字段指示器

ASP.Net Core MVC asp-validation-summary 样式