EmailAddress或DataType.Email属性

Fre*_*red 10 asp.net

[EmailAddress][DataType(DataType.Email)]属性有什么区别?

[Phone][DataType(DataType.PhoneNumber)]属性有什么区别?

[EmailAddress]
public string Email { get; set; }

[Phone]
public string Phone { get; set; }
Run Code Online (Sandbox Code Playgroud)

[DataType(DataType.Email)]
public string Email { get; set; }

[DataType(DataType.PhoneNumber)]
public string Phone { get; set; }
Run Code Online (Sandbox Code Playgroud)

这些是相同的还是有区别的?有什么不同?哪种方式首选?什么时候应该使用?

Jak*_*icz 15

DataTypeAttribute更改MVC呈现type<input>元素的属性.

@大卫是正确的,EmailAddressAttribute从派生DataTypeAttribute,所以你得到所有的功能[DataType(DataType.Email)]也存在,当您使用[EmailAddress].这两个属性都会导致MVC呈现HTML <input type="email">元素.

但是,EmailAddressAttribute除此之外还添加了服务器端验证.即如果您只使用,则没有服务器端验证DataTypeAttribute!您可以使用每个属性轻松测试模型.对于每个人,您应该获得客户端验证,并且不应该提交包含无效电子邮件地址的表单.但是,如果您将<input>元素类型更改为text(通过Firebug或诸如此类),您将删除该验证,并且能够使用您喜欢的任何文本提交表单.然后,在通过提交表单调用的操作中放置一个断点,并检查ModelState.IsValid- 当你使用时DataTypeAttribute,它的值是true.当你使用时EmailAddressAttribute,它是false.这是因为后者添加了一些基于正则表达式的服务器端验证.

结论:你应该使用EmailAddressAttributeet al.,否则你实际上并没有在你的端进行验证,而是依靠客户端来做这件事(Bad Thing™).

当然,您也可以使用DataTypeAttribute并实现自己的服务器端验证(例如因为EmailAddressAttribute无论出于何种原因,它都不适合您).