Validation 如何在自定义标记帮助器中获取不引人注目的验证标记

Validation 如何在自定义标记帮助器中获取不引人注目的验证标记,validation,tag-helpers,asp.net-core-tag-helpers,Validation,Tag Helpers,Asp.net Core Tag Helpers,在ASP.Net Core自定义标记帮助程序中,是否有一种简单的方法可以获取由标记帮助程序发出的HTML标记 换句话说,我可以在标记帮助器中获得与HtmlHelper.ValidationMessageFor()等价的东西吗?或者我需要自己通过挖掘ModelExpression.ModelMetadata属性来重新创建它吗 背景: 我编写了标记帮助程序,可以围绕常见HTML元素(如,)添加引导标记。除了添加引导标记外,这些标记帮助程序还可以在“输入”元素之后添加不引人注目的验证标记: <s

在ASP.Net Core自定义标记帮助程序中,是否有一种简单的方法可以获取由
标记帮助程序发出的HTML标记

换句话说,我可以在标记帮助器中获得与
HtmlHelper.ValidationMessageFor()等价的东西吗?或者我需要自己通过挖掘
ModelExpression.ModelMetadata
属性来重新创建它吗

背景:

我编写了标记帮助程序,可以围绕常见HTML元素(如
)添加引导标记。除了添加引导标记外,这些标记帮助程序还可以在“输入”元素之后添加不引人注目的验证标记:

<span class='field-validation-valid' data-valmsg-for='{name}' data-valmsg-replace='true'></span>

这对于客户端验证非常有效,因为JavaScript可以看到数据-*属性并执行它的操作但这不适用于服务器端验证。如果服务器端验证程序返回错误消息,则该消息不会显示在表单上

一些实验表明,
标记帮助器(我没有使用)与服务器端验证器一起工作,在相关模型变量出现验证错误时修改发送给客户端的HTML。修改后的HTML包含验证程序提供的错误消息:

<span class='field-validation-error' data-valmsg-for='{name}' data-valmsg-replace='true'>Some error message.</span>
一些错误消息。
因此,我的标记助手需要做同样的事情,并发出正常或错误验证消息标记

如果我的标记助手可以发出一个
元素,这将非常简单,但是,据我所知,没有办法将我的标记助手创建的HTML解释为标记助手

我可以深入挖掘模型元数据,发现错误消息,并适当地格式化验证消息
标记,但所有这些工作都已经由
HtmlHelper.ValidationMessageFor()
validation for
span标记助手为我完成了(可能比我所能做的更正确)


FWIW显示了一些魔法,允许标记助手访问
HtmlHelper
。如果可以的话,我宁愿避免使用这种路径,并使用闻起来更像本机“标记帮助器”代码的代码。

如果您仍然存在此问题,我可以通过在我自己的标记帮助器中重新调整现有ValidationMessageTagHelper的用途来实现所需的功能。如果确保在ValidationMessageTagHelper上调用ProcessAsync方法,如此行所示:

await validation.ProcessAsync(validationContext, validationOutput);
它将使用ViewData中的服务器端验证创建您期望的验证。 与服务器端验证一起使用的自定义验证标记帮助器如下所示:

[HtmlTargetElement("validation")]
public class CustomValidationTagHelper : TagHelper
{
    private IHtmlGenerator _htmlGenerator;

    public CustomValidationTagHelper(IHtmlGenerator htmlGenerator)
    {
        _htmlGenerator = htmlGenerator;
    }

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }

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

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

        var validationContext = CreateTagHelperContext();
        var validationOutput = CreateTagHelperOutput("span");

        var validation = new ValidationMessageTagHelper(_htmlGenerator)
        {
            For = For,
            ViewContext = ViewContext,

        };

        await validation.ProcessAsync(validationContext, validationOutput);
        validationOutput.Attributes.SetAttribute("class", "field-validation-error text-danger");

        output.TagName = "";


        output.Content.AppendHtml(validationOutput);
    }

    private static TagHelperContext CreateTagHelperContext()
    {
        return new TagHelperContext(
            new TagHelperAttributeList(),
            new Dictionary<object, object>(),
            Guid.NewGuid().ToString("N"));
    }

    private static TagHelperOutput CreateTagHelperOutput(string tagName)
    {
        return new TagHelperOutput(
            tagName,
            new TagHelperAttributeList(),
            (a, b) =>
            {
                var tagHelperContent = new DefaultTagHelperContent();
                tagHelperContent.SetContent(string.Empty);
                return Task.FromResult<TagHelperContent>(tagHelperContent);
            });
    }
}
[HtmlTargetElement(“验证”)]
公共类CustomValidationTagHelper:TagHelper
{
私人IHTML发电机_htmlGenerator;
公共CustomValidationTagHelper(IHtmlGenerator htmlGenerator)
{
_htmlGenerator=htmlGenerator;
}
[HtmlAttributeName(“asp for”)]
{get;set;}的公共模型表达式
[HTMLATTRIBUTTENOTBOND]
[查看上下文]
公共视图上下文{get;set;}
公共重写异步任务ProcessAsync(TagHelperContext上下文,TagHelperOutput输出)
{
var validationContext=CreateTagHelperContext();
var validationOutput=CreateTagHelperOutput(“span”);
var validation=new ValidationMessageTagHelper(\u htmlGenerator)
{
For=For,
ViewContext=ViewContext,
};
wait validation.ProcessAsync(validationContext,validationOutput);
validationOutput.Attributes.SetAttribute(“类”,“字段验证错误文本危险”);
output.TagName=“”;
output.Content.AppendHtml(validationOutput);
}
私有静态TagHelperContext CreateTagHelperContext()
{
返回新标记HelperContext(
新标记HelperAttributeList(),
新字典(),
Guid.NewGuid().ToString(“N”);
}
专用静态TagHelperOutput CreateTagHelperOutput(字符串标记名)
{
返回新标记HelperOutput(
标记名,
新标记HelperAttributeList(),
(a,b)=>
{
var tagHelperContent=new DefaultTagHelperContent();
tagHelperContent.SetContent(string.Empty);
返回Task.FromResult(tagHelperContent);
});
}
}
并且在页面上也是这样使用的:

<validation asp-for="Username" />

如果您仍然存在此问题,我可以通过在我自己的TagHelper中重新调整现有ValidationMessageTagHelper的用途来实现所需的功能。如果确保在ValidationMessageTagHelper上调用ProcessAsync方法,如此行所示:

await validation.ProcessAsync(validationContext, validationOutput);
它将使用ViewData中的服务器端验证创建您期望的验证。 与服务器端验证一起使用的自定义验证标记帮助器如下所示:

[HtmlTargetElement("validation")]
public class CustomValidationTagHelper : TagHelper
{
    private IHtmlGenerator _htmlGenerator;

    public CustomValidationTagHelper(IHtmlGenerator htmlGenerator)
    {
        _htmlGenerator = htmlGenerator;
    }

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }

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

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

        var validationContext = CreateTagHelperContext();
        var validationOutput = CreateTagHelperOutput("span");

        var validation = new ValidationMessageTagHelper(_htmlGenerator)
        {
            For = For,
            ViewContext = ViewContext,

        };

        await validation.ProcessAsync(validationContext, validationOutput);
        validationOutput.Attributes.SetAttribute("class", "field-validation-error text-danger");

        output.TagName = "";


        output.Content.AppendHtml(validationOutput);
    }

    private static TagHelperContext CreateTagHelperContext()
    {
        return new TagHelperContext(
            new TagHelperAttributeList(),
            new Dictionary<object, object>(),
            Guid.NewGuid().ToString("N"));
    }

    private static TagHelperOutput CreateTagHelperOutput(string tagName)
    {
        return new TagHelperOutput(
            tagName,
            new TagHelperAttributeList(),
            (a, b) =>
            {
                var tagHelperContent = new DefaultTagHelperContent();
                tagHelperContent.SetContent(string.Empty);
                return Task.FromResult<TagHelperContent>(tagHelperContent);
            });
    }
}
[HtmlTargetElement(“验证”)]
公共类CustomValidationTagHelper:TagHelper
{
私人IHTML发电机_htmlGenerator;
公共CustomValidationTagHelper(IHtmlGenerator htmlGenerator)
{
_htmlGenerator=htmlGenerator;
}
[HtmlAttributeName(“asp for”)]
{get;set;}的公共模型表达式
[HTMLATTRIBUTTENOTBOND]
[查看上下文]
公共视图上下文{get;set;}
公共重写异步任务ProcessAsync(TagHelperContext上下文,TagHelperOutput输出)
{
var validationContext=CreateTagHelperContext();
var validationOutput=CreateTagHelperOutput(“span”);
var validation=new ValidationMessageTagHelper(\u htmlGenerator)
{
For=For,
ViewContext=ViewContext,
};
wait validation.ProcessAsync(validationContext,validationOutput);
validationOutput.Attributes.SetAttribute(“类”,“字段验证错误文本危险”);
output.TagName=“”;
output.Content.AppendHtml(validationOutput);
}
专用静态Ta