如何创建包含其他标签助手的自定义标签助手

时间:2018-08-18 01:57:17

标签: c# asp.net-core asp.net-core-2.1 asp.net-core-tag-helpers

public class FormControlTextBoxHelper:TagHelper
{

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

            //Here I want to write <label asp-for="InputModel.Title" class="control-label"></label> and other tag helpers

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

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

        }

    }
}

我一两个小时都找不到有关如何包含其他标签助手的自定义标签助手的信息。 Microsoft docs显示了非常简单的示例,其中不包含很多有意义的信息。

1 个答案:

答案 0 :(得分:0)

在阅读了包含答案的多篇不同文章之后,我发现了这一点。

因此,首先您需要注入标签帮助器IHtmlGenerator的构造函数中,该构造器将生成标签帮助器html,元素的生成也需要ViewContext,您只能将其作为属性与{ {1}} Attribute

这是ViewContext属性的摘要:

  

摘要:

     

指定应使用当前的Microsoft.AspNetCore.Mvc.Rendering.ViewContext设置标记帮助器属性。     创建标签助手时。该属性必须具有公共设置方法。

代码看起来像这样:

ViewContext

因此,这个名为[HtmlTargetElement("form-control-text-box")] public class FormControlTextBoxHelper:TagHelper { [HtmlAttributeName("asp-for")] public ModelExpression For { get; set; } private readonly IHtmlGenerator _generator; [ViewContext] public ViewContext ViewContext { get; set; } public FormControlTextBoxHelper(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); 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()); } } } 的标记帮助程序将产生等于以下内容的html:

<form-control-text-box asp-for="InputModel.Title"></form-control-text-box>

我希望我能帮助别人更快地弄清楚。