EmailAttribute未在ASP.NET Core的ViewModel中正确validation

这是位于我的viewmodel中的字段:

[Required(ErrorMessage = "Email is missing."), EmailAddress(ErrorMessage = "Email is not valid.")] public string Email { get; set; } 

EmailAddress来自EmailAddressAttribute.EmailAddressAttribute()类型)
这是HTML的相关部分:

 

当我在电子邮件文本框中输入myemail时,它会说

电子邮件无效

但是,在键入myemail@email ,视图模型将会将其视为正确(仅在前端)。

 public async Task Register([FromForm]VisitViewModel vm) 

像这样的ModelState转换会使ModelState无效并拒绝电子邮件,因此该部分是可以的。

根据这个答案 ,前端应该表明这是无效的

谁能解释一下这里发生了什么? 我绝对亏本。

在客户端和服务器之间validation电子邮件的方式存在不一致。

客户端

jQuery Validation使用HTML标准中定义的正则表达式。 根据该表达式, email@email是一个有效的电子邮件地址。

服务器端

.Net EmailAddressAttribute有自己的正则表达式,您可以在此处找到它 。 根据该表达式, email@email是一个无效的电子邮件地址。

但它变得更加令人困惑! 如果您正在创建.Net Core应用程序,则定位跨平台会使用该属性的CoreFX版本,该版本似乎根本不使用正则表达式 。 根据该方法, email@email有效的电子邮件地址。

您可以通过切换Core Console App的project.json中的值来自行查看:

 public static void Main(string[] args) { var attr = new EmailAddressAttribute(); var email = "email@email"; var isValid = attr.IsValid(email); // false with "net452", true with "netcoreapp1.0" } 

你可以做什么

我能想到的最快的解决方法是更改jQuery Validate电子邮件方法中的正则表达式以匹配.Net中的正则表达式,或者创建自己的validation方法以添加到它来检查此特定情况。

您还可以回退从服务器返回错误,这将显示它们对ModelState任何错误的validation消息。 这不是一个实时错误,但他们仍然会得到一个很好的消息来处理不正确的电子邮件。