电子邮件地址或DataType.Email属性

10

[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; }

这两者是相同的还是有差异?差别在哪里?哪种方式更受欢迎?应该在何时使用哪种方式?


你必须自行检查。有些浏览器可能支持,也可能不支持这些类型。 - Yoda
@Yoda:网络浏览器无法本地支持System.ComponentModel对象(或.NET Framework),因此您的意思并不是很清楚... - David
@David 当生成HTML时,如果您例如仅使用[DataType [DataType.Date]]DateTime属性上方,那么Html.EditorFor将生成一个HTML元素<.... type="Date" .../>,它将具有Chrome支持的日期选择器。如果您不使用此注释,则不会发生这种情况。我没有说过任何关于本地支持的话。这些注释会影响输出的HTML,即type =“”部分,某些浏览器将支持某些类型,而某些则不支持。例如,DateTime已从所有浏览器中删除,但您仍然可以使用此DateType并在输出中使用。 - Yoda
@David,HTML标记会存在,但是浏览器不像对待 DataType.Date 或者 DataType.Time 那样提供日期时间选择器。你可以参考我的这个问题:https://dev59.com/-V8e5IYBdhLWcg3wb52S - Yoda
1
@Yoda:问题不在于浏览器是否支持不同的输出,而在于这些不同的注释是否发出不同的输出(或者是否有任何不同之处)。浏览器并不参与回答这个问题。如果你暗示存在不同的输出,那么通过识别差异在答案中指出可能是值得注意的。如果你只是说“浏览器会以不同的方式处理不同的输出”,那么我认为这是一个基本常识。 - David
3个回答

15
DataTypeAttribute将MVC渲染的<input>元素的type属性更改为指定的数据类型。
@David正确指出EmailAddressAttribute派生自DataTypeAttribute,因此使用[EmailAddress]时也存在[DataType(DataType.Email)]提供的所有功能。这两个属性都会导致MVC渲染HTML <input type="email">元素。
然而,EmailAddressAttribute还在此基础上添加了服务器端验证。即如果仅使用DataTypeAttribute,则没有服务器端验证!您可以轻松测试每个属性的模型。对于它们的每一个,您应该得到客户端验证,并且不可能使用无效的电子邮件地址提交表单。但是,如果您通过Firebug等方式将<input>元素类型更改为text,则会删除该验证,并且可以使用任何文本提交表单。然后,在调用提交表单的操作中放置断点并检查ModelState.IsValid的值-当您使用DataTypeAttribute时,它是true。当您使用EmailAddressAttribute时,它是false。这是因为后者添加了一些基于正则表达式的服务器端验证。
结论:您应该使用EmailAddressAttribute等,否则您不会在自己的端执行验证,而是依赖于客户端执行(一件坏事)。
当然,您还可以使用DataTypeAttribute并实现自己的服务器端验证(例如,因为EmailAddressAttribute中的验证对您不起作用)。

-1

除了属性的静态类型之外,可能没有什么区别。查看文档,像EmailAddressAttributePhoneAttribute这样的类继承自DataTypeAttribute,因此它们很可能只是更通用的父级的方便委托,其属性已经设置好了。

还要注意,这与MVC实际上没有任何关系,这是System.ComponentModel功能。 MVC 使用它,但不拥有它。


1
这不正确 - EmailAddressAttribute 进行服务器端验证,而 DataTypeAttribute 则不会。 - Jakub Januszkiewicz

-1

就它们在MVC中的实现而言,我认为有一段时间EmailAddressAttribute和PhoneAttribute与验证相关,并且会呈现input type="text",而DataType属性则与呈现相关。然而,经过一些快速测试,这不再是这种情况。

事实上,它们似乎是相同功能的不同实现。它们都呈现为type="email",并且都验证电子邮件地址。DataType.Email验证与EmailAddressValidation略有不同,它不通过jquery.validate.unobtrusive.js进行验证连接,因此我倾向于使用EmailAddressAttribute,但可能不会有功能上的区别。


1
EmailAddressAttribute 进行服务器端验证,而 DataTypeAttribute 则不会。这是一个基本的功能差异。 - Jakub Januszkiewicz

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