加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 自定义验证摘要和错误的格式

发布时间:2020-12-15 08:18:19 所属栏目:百科 来源:网络整理
导读:问题 摘要 对于验证摘要,您通常会遇到以下情况: div asp-validation-summary="ModelOnly" class="..."/div 如果有空字符串的错误,则字段/属性将显示在 ul内的该div内.名单. 如果我想使用具有特定类属性的div序列来显示它们怎么办?或任何其他自定义格式?
问题

摘要

对于验证摘要,您通常会遇到以下情况:

<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)
>创建新的验证标记帮助程序(注册新的标记帮助程序)

自定义现有的验证标记助手

asp-validation-summaryasp-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);   
            }
        }
    }
}

示例 – 将字段验证错误类添加到表单组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)
        {
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读