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

时间:2016-06-03 08:57:04

标签: c# asp.net-core asp.net-core-mvc email-validation asp.net-mvc-viewmodel

这是位于我的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无效并拒绝该电子邮件,因此该部分没问题。

根据this answer,前端应将此表示为无效

有人可以解释这里发生了什么吗?我绝对亏本。

1 个答案:

答案 0 :(得分:2)

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

客户端

jQuery Validation使用正则表达式defined in the HTML standard。根据该表达式,email@email有效电子邮件地址。

服务器端

.Net EmailAddressAttribute拥有自己的正则表达式,can find here。根据该表达式,email@email无效电子邮件地址。

但它更令人困惑!如果您要创建.Net Core应用,则定位跨平台会使用属性which doesn't appear to use a regular expression at all的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 email method中的正则表达式以匹配.Net中的正则表达式,或创建自己的验证方法来添加它来检查此特定情况。

您还可以回退从服务器返回错误,这会向{.1}}显示错误的验证消息。它不会是一个实时错误,但他们仍然会得到一个很好的消息来处理不正确的电子邮件。