Validation 如何在自定义标记帮助器中获取不引人注目的验证标记
在ASP.Net Core自定义标记帮助程序中,是否有一种简单的方法可以获取由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
标记帮助程序发出的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