c# – 自定义验证摘要和错误的格式
问题
摘要 对于验证摘要,您通常会遇到以下情况: <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) 处理自定义表单验证格式(尝试DRY,因为我的应用程序有很多表单)以及上面显示的自定义规则最常用的方法是什么? 解决方法
以下是一些扩展点,您可以考虑为验证摘要和字段验证错误提供自定义呈现:
>自定义现有验证标记助手(注册新的IHtmlGenerator) 自定义现有的验证标记助手
您可以提供派生DefaultHtmlGenerator的自定义实现并覆盖这些方法,然后在启动时注册该服务.这样,这些标记助手将使用您的自定义实现. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddTransient<IHtmlGenerator,MyHtmlGenerator>(); } 这是source code of 示例 – 创建新实现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 此外,在创建自定义标记帮助程序以进行验证时,您可以考虑: >从头开始创建验证标记助手 示例 – 将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); } } } } 示例 – 将字段验证错误类添加到表单组div 在下面的示例中,我添加了对标准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) { } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |