在 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。这是读取属性生成的元数据的HtmlHelper
或TagHelper
方法的职责。您显然可以编写自己的 HtmlHelper 扩展方法或 TagHelpers 来发出脚本标签以及用于表单控件的 html,但这将是一个非常糟糕的主意(导致内联脚本、重复脚本、错误顺序的脚本等)
@StephenMuecke:我认为说 ValidationAttributes 不能生成 html 并不是 100% 正确的。目前他们已经在 AddValidation 方法中生成 html 属性(data-val-x)。但是我知道这目前仅限于属性。
正确。它是生成 html 的 HtmlHelper
或 TagHelper
方法。例如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 中将自定义查询参数添加到操作 URL
使用自定义位置时如何在 asp.net core mvc 中指定视图位置?
asp.net core2 mvc 基础教程--服务注册和管道
ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide