在 Asp.net Core MVC 中定义自定义客户端验证规则

Posted

技术标签:

【中文标题】在 Asp.net Core MVC 中定义自定义客户端验证规则【英文标题】:Defining Custom Client Validation Rules in Asp.net Core MVC 【发布时间】:2018-07-02 12:09:41 【问题描述】:

可以通过创建实现ValidationAttribute, IClientModelValidator 的类来实现Asp.net 核心中的自定义验证属性。

在该类中,可以编写验证规则并发出相关的 data-val 属性。

javascript 端,我们需要一个执行客户端验证的函数。

这可以通过使用.validator.addMethod(...) 和$.validator.unobtrusive.adapters.add(...) 归档

此代码通常添加到相关的 .js 文件中。

但是,我更愿意从我的验证属性中发出 javascript 代码。这将使共享和重用属性变得更加容易。

任何想法如何实现这一目标?

【问题讨论】:

你不能。 ValidationAttribute 不负责(也不能)生成 html。这是读取属性生成的元数据的HtmlHelperTagHelper 方法的职责。您显然可以编写自己的 HtmlHelper 扩展方法或 TagHelpers 来发出脚本标签以及用于表单控件的 html,但这将是一个非常糟糕的主意(导致内联脚本、重复脚本、错误顺序的脚本等) @StephenMuecke:我认为说 ValidationAttributes 不能生成 html 并不是 100% 正确的。目前他们已经在 AddValidation 方法中生成 html 属性(data-val-x)。但是我知道这目前仅限于属性。 正确。它是生成 html 的 HtmlHelperTagHelper 方法。例如HtmlHelper 类有一个GetUnobtrusiveValidationAttributes() 方法,它读取应用于属性的Validation 属性的元数据以生成data-val-* 属性。 ValidationAttribute 没有使用它的应用程序类型的上下文 - 它也可以是 Windows 窗体应用程序。 是的,你是对的。从技术上讲,生成输出的是 HtmlHelper。我想说的是,在属性类中,我可以指定 html 助手将创建的属性。尽管如此,即使可能对 javascript 做同样的事情,这仍然会导致您指出的问题(内联脚本等)。我很不高兴客户端/服务器的验证代码位于两个不同的地方,但似乎我不得不忍受。 【参考方案1】:

有一个名为 Dryv(来自 DRY Validation)的新框架正是用于此目的。您可以在https://dryv-lib.net 下找到它。您可以在 C# 中使用 lambda 表达式定义您的验证规则,并将它们翻译成 JavaScript。

public class Customer

    public static readonly DryvRules Rules = DryvRules
        .For<Customer>()
        .Rule(m => m.TaxId,
            m => string.IsNullOrWhiteSpace(m.Company) || !string.IsNullOrWhiteSpace(m.TaxId)
                ? DryvResult.Success
                : $"The tax ID for m.Company must be specified.");

    public string Company  get; set; 

    [Required]
    public string Name  get; set; 

    [DryvRules]
    public string TaxId  get; set; 

免责声明:我是该框架的作者。

【讨论】:

以上是关于在 Asp.net Core MVC 中定义自定义客户端验证规则的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core MVC - 自定义验证

在 ASP.NET Core MVC 中将自定义查询参数添加到操作 URL

使用自定义位置时如何在 asp.net core mvc 中指定视图位置?

asp.net core2 mvc 基础教程--服务注册和管道

ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide

如何在 ASP.NET Core 控制器中返回自定义 HTTP 响应?