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

这是一个位于我的视图模型中的字段:

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

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

<div>
    <label for="inputEmail">EMAIL</label>
    <input id="inputEmail" ng-model="email" asp-for="Email" class="form-control" />
</div>
<div>
    <span asp-validation-for="Email" class="text-danger"></span>
</div>

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

电子邮件无效

但是,当输入myemail@email ,它将被视图模型视为正确(仅在前端)。

public async Task<JsonResult> Register([FromForm]VisitViewModel vm)

像这样施放会使ModelState无效并拒绝电子邮件,所以这部分是可以的。

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

任何人都可以解释这里发生了什么? 我处于绝对的损失。


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

客户端

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

服务器端

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

但它变得更加混乱! 如果您要创建.Net Core应用程序,则针对跨平台使用CoreFX版本的属性,该属性看起来并不使用正则表达式。 根据这种方法, email@email是一个有效的电子邮件地址。

您可以通过切换Core控制台应用程序的project.json中的值来亲自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中的正则表达式,或者创建自己的验证方法以添加到其中,以检查此特定情况。

您也可以回退从服务器返回的错误,这会向他们显示有关ModelState错误的验证消息。 这不会是一个实时错误,但他们仍然会收到一条好消息来处理不正确的电子邮件。

链接地址: http://www.djcxy.com/p/92849.html

上一篇: EmailAttribute is not validating correctly in a ViewModel from ASP.NET Core

下一篇: How to check if email is valid format or not