[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; }
这些是相同的还是有区别的?有什么不同?哪种方式首选?应该何时使用?
答案 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 documentation,EmailAddressAttribute
和PhoneAttribute
等类继承自DataTypeAttribute
,因此它们可能只是方便委托给已设置其属性的更通用的父级。
另请注意,这与MVC没有任何关系,这是System.ComponentModel
功能。 MVC 使用,但不拥有它。
答案 2 :(得分:-1)
就他们在MVC中的实现而言,我认为有一段时间,EmailAddressAttribute和PhoneAttribute是相关的验证,并且会呈现输入类型=&#34; text&#34;并且DataType属性呈现相关。但经过一些快速测试后不再是这种情况。
实际上,它们似乎是相同功能的不同实现。它们都呈现为类型=&#34;电子邮件&#34;并验证电子邮件地址。 DataType.Email验证与EmailAddressValidation稍有不同,它不会通过jquery.validate.unobtrusive.js连接验证,因此我倾向于EmailAddressAttribute,但可能没有功能差异。