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

Posted

技术标签:

【中文标题】EmailAttribute 未在 ASP.NET Core 的 ViewModel 中正确验证【英文标题】:EmailAttribute is not validating correctly in a ViewModel from ASP.NET Core 【发布时间】:2016-10-03 06:24:06 【问题描述】:

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

[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,前端应该指出这是无效的

谁能解释这里发生了什么?我完全不知所措。

【问题讨论】:

我认为电子邮件是有效的:3 'myemail@email' 对你有效吗?看起来很奇怪,因为它后面没有 '.net' 或 '.com' 或其他任何东西,但您可能会认为这不是重点,因为在这种情况下,EmailAddressAttribute 应该返回 false。 (它在后端正确,“myemail@email”在那里无效,但在前端有效) 如果一开始就知道错了,为什么不改前端的validator呢。使用 javascript 很容易验证它 因为我在 ASP.net 核心中工作,如果出于某种原因我想将电子邮件字段更改为文本或数字字段,它应该自行更改验证或与此字段相关的任何其他内容.我不应该进入每个 javascript 文件并自己更改它。我知道如何让它工作,但不知道如何让它正常工作。 我确认我在我的应用程序中尝试使用 myemail@email 得到了相同的结果,因此它要么是错误,要么被认为是有效的电子邮件。我认为在任何情况下通过发送确认链接来验证电子邮件很重要,但这是一个有趣的问题,我想知道微软是否认为这是一个错误 【参考方案1】:

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

客户端

jQuery 验证使用正则表达式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 是一个有效电子邮件地址。

您可以通过在核心控制台应用程序的 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 的正则表达式,或者创建自己的验证方法以添加到其中以检查这种特殊情况。

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

【讨论】:

以上是关于EmailAttribute 未在 ASP.NET Core 的 ViewModel 中正确验证的主要内容,如果未能解决你的问题,请参考以下文章

远程属性验证未在 Asp.Net MVC 中触发

ASP.NET DropDown SelectedIndexChanged 未在 Firefox 中使用 UpdatePanel 触发

ASP.NET DropDownList 未在 SelectedIndexChanged 上绑定 SQL

标签助手未在 ASP.NET Core 2 中处理

RateIt jquery 插件的图像未在 asp.net 中加载?

捆绑包未在 ASP.NET MVC 4 中加载