ASP/.NET/MVC 中 Datatype.EmailAddress 的用途

9

我有一个账户模型,其中我使用电子邮件地址作为用户名。

public class RegisterModel
    {
        [Required]
        [Display(Name = "Email Address")]
        [DataType(DataType.EmailAddress)]
        public string UserName { get; set; }

我设计了一个自定义类来验证电子邮件。但最近我注意到DataType.EmailAddress。我尝试在上面的代码中使用此Datatype来检查是否可以在没有我的自定义类的情况下验证用户名,但它失败了。所以我的问题是,这种DataType在.NET中有什么用处。在我的注册表单上似乎没什么作用。
编辑:它甚至不能针对正则表达式进行验证。例如,用户名:SS,ssssss,tttt,etc 都被视为有效电子邮件。
编辑:各位,我有一个在代码后端验证电子邮件的类。我知道验证电子邮件的复杂性。我只是问一下这个DataType的用途。

1
你可以创建一个EditorTemplate。 - SLaks
可能是mvc [DataType(DataType.EmailAddress) no validation]的重复问题。 - ediblecode
1
DataType属性用于格式化目的,而不是用于验证。 - ediblecode
@jumpingcode,你能否解释一下那个问题如何说明这种数据类型的作用? - Flood Gravemind
1
@jumpingcode - "影响这个数据类型的作用。" 我并不想在这里引发评论战,只是礼貌地指出你在回答问题时表达得有些粗糙。 - Tommy
显示剩余6条评论
4个回答

17

所以,您询问的是这个数据类型是什么,而不是为什么它没有进行验证,是吗?根据MSDN的说法,DataType属性主要用于格式化而不是验证(这是您已经学到的)。该属性应该做的是,在使用Html.DisplayFor()助手时,将字段呈现为可点击的超链接。

@Html.DisplayFor(x=>x.UserName)

呈现

<a href="mailto:{0}">{0}</a>

此外,正如下面评论中的Zhaph所指出的那样,在Html.EditorFor()中使用它将生成一个HTML 5电子邮件输入,它看起来像这样:

<input type="email".../>

来自MSDN

以下示例使用DataTypeAttribute来自定义AdventureWorksLT数据库中customer表的EmailAddress数据字段的显示。电子邮件地址显示为超链接,而不是ASP.NET Dynamic Data从内置数据类型推断出的简单文本。


2
它还可以被EditorFor助手用于生成一个<input type="email" [...] />HTML5输入字段。 - Zhaph - Ben Duguid
1
@Zhaph-BenDuguid - 很酷,这可能是4.5中的新功能(我不确定在这个问题最初发布时是否可用 :))- 而且绝对有用! - Tommy

13

DataType本身不会触发任何服务器端验证。但是,从MVC 4开始使用DataType.EmailAddress将使HTML输入使用type="email",这又使得jQuery Validation在客户端执行正则表达式验证。

.NET 4.5引入了[EmailAddress]属性,它是DataTypeAttribute的子类。通过使用[EmailAddress],您既可以获得客户端验证,也可以获得服务器端验证。


警告:服务器端验证非常简单,仅检查输入字符串中是否包含“@”字符。 - croban
从4.7.2版本开始,正则表达式电子邮件验证被禁用了,您需要启用它来解决此问题。 https://social.msdn.microsoft.com/Forums/en-US/0ce2ad75-33f9-4e0c-8766-9422bfb5bdc6/emailaddressattribute-not-working-correctly - croban

4
您可以使用EmailAddress数据注释或正则表达式来解决此问题。日期类型用于告诉HTML Helper呈现视图的HTML。
[EmailAddress]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Must be a valid Email Address")]

2

Datatype.Emailaddress是从DataTypeAttribute派生的,它添加了客户端电子邮件验证功能。您还需要在相应的视图中设置<% Html.EnableClientValidation(); %>

或者您可以使用DataAnnotations库,通过使用EmailAddress(这将执行服务器端验证)。

using System.ComponentModel.DataAnnotations; 

    [Required]
    [EmailAddress]
    public String Email { get; set; }

这是验证电子邮件地址的正则表达式。

[Required(ErrorMessage="Email is required")]
[RegularExpression(@"[A-Za-z0-9._%+-]+[A-Za-z0-9.-]+\.[A-Za-z] {2,4}",
public String Email {get; set;}

您可以创建自定义电子邮件验证属性。 http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接