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消息。 这不是一个实时错误,但他们仍然会得到一个很好的消息来处理不正确的电子邮件。