EmailAddress或DataType.Email属性

时间:2014-09-23 11:52:51

标签: asp.net

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

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

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

[Phone]
public string Phone { get; set; }

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

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

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

3 个答案:

答案 0 :(得分:15)

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

@David是EmailAddressAttribute派生自DataTypeAttribute的权利,因此当您使用[DataType(DataType.Email)]时,[EmailAddress]所带来的所有功能都会出现。这两个属性都会导致MVC呈现HTML <input type="email">元素。

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

结论:你应该使用EmailAddressAttribute等,否则你并没有真正在你的身上进行验证,而是依靠客户来做(Bad Thing™)。

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

答案 1 :(得分:-1)

除了属性的静态类型之外,可能没有区别。查看the documentationEmailAddressAttributePhoneAttribute等类继承自DataTypeAttribute,因此它们可能只是方便委托给已设置其属性的更通用的父级。

另请注意,这与MVC没有任何关系,这是System.ComponentModel功能。 MVC 使用,但不拥有它。

答案 2 :(得分:-1)

就他们在MVC中的实现而言,我认为有一段时间,EmailAddressAttribute和PhoneAttribute是相关的验证,并且会呈现输入类型=&#34; text&#34;并且DataType属性呈现相关。但经过一些快速测试后不再是这种情况。

实际上,它们似乎是相同功能的不同实现。它们都呈现为类型=&#34;电子邮件&#34;并验证电子邮件地址。 DataType.Email验证与EmailAddressValidation稍有不同,它不会通过jquery.validate.unobtrusive.js连接验证,因此我倾向于EmailAddressAttribute,但可能没有功能差异。