对于验证摘要,您通常会遇到以下情况:
<div asp-validation-summary="ModelOnly" class="..."></div>
如果有空字符串的错误,则字段/属性将显示在< ul>内的该div内.名单.
如果我想使用具有特定类属性的div序列来显示它们怎么办?或任何其他自定义格式?
现场验证
对于现场验证,您通常会:
<div class="form-group"> <label asp-for="OldPassword"></label> <input asp-for="OldPassword" class="form-control" /> <span asp-validation-for="OldPassword" class="text-danger"></span> </div>
并将错误作为文本插入span元素中.
我正在使用一个模板,该模板需要将has-errors类应用于form-group div元素,以防有错误,因为它需要设置标签和输入的样式.
它还要求跨度为div(由于某些未知原因),并且令人惊讶地将跨度更改为div可防止div插入错误文本;更不用说将div包装在div中会产生这样的问题:div有适当的间距应用于它,所以即使没有错误,div也显示出烦人的空间.
问题(tl; dr)
解决方法
>自定义现有验证标记助手(注册新的IHtmlGenerator)
>创建新的验证标记帮助程序(注册新的标记帮助程序)
asp-validation-summary
和asp-validation-for
标记帮助程序使用GenerateValidationSummary和GenerateValidationMessage方法注册的IHtmlGenerator服务实现默认情况下为DefaultHtmlGenerator
.
您可以提供派生DefaultHtmlGenerator的自定义实现并覆盖这些方法,然后在启动时注册该服务.这样,这些标记助手将使用您的自定义实现.
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddTransient<IHtmlGenerator,MyHtmlGenerator>(); }
这是source code of DefaultHtmlGenerator
的链接,可帮助您自定义实现.
示例 – 创建新实现IHtmlGenerator
这里只是一个简单的示例,用于显示所需的命名空间和方法,以及可以进入自定义实现的内容.提供自定义实现后,不要忘记在ConfigureServices中注册它,就像我上面所做的那样.
using Microsoft.AspNetCore.Antiforgery; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal; using Microsoft.Extensions.Options; using System.Text.Encodings.Web; namespace ValidationSampleWebApplication { public class MyHtmlGenerator : DefaultHtmlGenerator { public MyHtmlGenerator(IAntiforgery antiforgery,IOptions<MvcViewOptions> optionsAccessor,IModelMetadataProvider MetadataProvider,IUrlHelperFactory urlHelperFactory,HtmlEncoder htmlEncoder,ValidationHtmlAttributeProvider validationAttributeProvider) : base(antiforgery,optionsAccessor,MetadataProvider,urlHelperFactory,htmlEncoder,validationAttributeProvider) { } public override TagBuilder GenerateValidationMessage(ViewContext viewContext,ModelExplorer modelExplorer,string expression,string message,string tag,object htmlAttributes) { return base.GenerateValidationMessage(viewContext,modelExplorer,expression,message,tag,htmlAttributes); } public override TagBuilder GenerateValidationSummary(ViewContext viewContext,bool excludePropertyErrors,string headerTag,object htmlAttributes) { return base.GenerateValidationSummary(viewContext,excludePropertyErrors,headerTag,htmlAttributes); } } }
创建新的验证标记帮助程序
您也可以author your custom tag helpers.为此,它足以从TagHelper派生并覆盖Process方法.
然后,您只需在视图中注册已创建的标记助手,或在_ViewImports.cshtml中全局注册:
@using ValidationSampleWebApplication @using ValidationSampleWebApplication.Models @addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *,ValidationSampleWebApplication
>从头开始创建验证标记助手
>从现有的tag-helper类驱动
示例 – 将hasError类添加到表单组div
在这个例子中,我创建了一个asp-myvalidation,可以用这种方式应用于div元素< div class =“form-group”asp-myvalidation-for =“LastName”>如果指定的字段有验证错误,则会向div添加hasError类.不要忘记在_ViewImports.cshtml中注册它,就像我上面所做的那样.
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Mvc.TagHelpers; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace ValidationSampleWebApplication { [HtmlTargetElement("div",Attributes = MyValidationForAttributeName)] public class MyValidationTagHelper : TagHelper { private const string MyValidationForAttributeName = "asp-myvalidation-for"; [HtmlAttributeNotBound] [ViewContext] public ViewContext ViewContext { get; set; } [HtmlAttributeName(MyValidationForAttributeName)] public ModelExpression For { get; set; } public override void Process(TagHelperContext context,TagHelperOutput output) { base.Process(context,output); ModelStateEntry entry; ViewContext.ViewData.ModelState.TryGetValue(For.Name,out entry); if (entry != null && entry.Errors.Count > 0) { var builder = new TagBuilder("div"); builder.AddCssClass("hasError"); output.MergeAttributes(builder); } } } }
在下面的示例中,我添加了对标准asp-validation-for标记帮助程序的div支持.现有的标记助手只支持div元素.在这里,我已经为asp-validation-for标签助手添加了div支持,如果出现错误,它将添加字段验证错误,否则,在有效情况下,div将具有字段验证有效类.
标记的默认行为是,如果标记包含内容,则不会对标记的内容进行任何更改.因此,为了将标记助手添加到空跨度,将向span添加验证错误,但对于具有某些内容的div,它只是更改div的类.不要忘记在_ViewImports.cshtml中注册它,就像我上面所做的那样.
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Mvc.TagHelpers; namespace ValidationSampleWebApplication { [HtmlTargetElement("div",Attributes = ValidationForAttributeName)] public class MytValidationMessageTagHelper : ValidationMessageTagHelper { private const string ValidationForAttributeName = "asp-validation-for"; public MytValidationMessageTagHelper(IHtmlGenerator generator) : base(generator) { } } }