【问题标题】:what are the differences between [DataType(DataType.EmailAddress)] & [EmailAddress][DataType(DataType.EmailAddress)] 和 [EmailAddress] 有什么区别
【发布时间】:2014-10-11 15:59:36
【问题描述】:

我试图了解使用之间的主要区别是什么 [DataType(DataType.EmailAddress)] & [EmailAddress]

在模型类中:-

public class MYViewModel {
[DataType(DataType.EmailAddress)] OR [EmailAddress]
public string Email { get; set; }

我做了一个测试,这两个属性将执行以下操作:-

  1. 将阻止用户添加无效的电子邮件地址

  2. 会将值显示为“EmailTo:...”

但是我在功能方面找不到任何差异,当然如果我使用html.TextboxFor 那么Datatype 将没有任何效果,而如果我使用html.EditorFor 那么Datatype 数据注释将起作用, ,但我说的是技术实现方面的差异?

【问题讨论】:

  • This post 应该很有帮助。前者与EditorFor 客户端(html5 email 字段)一起“工作”,后者较新并且还进行服务器端模型验证。
  • 所以两者都会做服务器端验证?
  • 并且两者都将进行验证以防止无效的电子邮件地址.. 虽然根据 MSDN,DataType 属性主要用于格式化而不是验证,......所以如果 MSDN 没有说话,就没有 tsute关于 Datatype.EmailAddress 因为它还会进行验证?你能建议吗?

标签: asp.net asp.net-mvc asp.net-mvc-5 data-annotations


【解决方案1】:

希望这可以澄清......

如您所述,DataType 属性主要用于格式化,而不是验证。它似乎起作用的原因是:

  • @Html.EditorFor 呈现 HTML5 <input type="email" ....,它由客户端/浏览器进行验证。如果浏览器符合要求,则进行客户端验证。它会“工作”,因为客户端为您验证了它(但这不是服务器端验证)

您可以通过将视图中的@Html.EditorFor 更改为@Html.TextBoxFor 来测试它,这会将输入字段呈现为<input type="text" ...>(标准文本输入字段,而不是HTML5 email)。


样本测试

给定一个类似这样的模型:

public class User
{
    [Required(ErrorMessage = "Email must be provided")]
    [DataType(DataType.EmailAddress, ErrorMessage = "this doesn't do email format validation")]        
    [EmailAddress(ErrorMessage = "Not a valid Email")] //Comment un-comment to see effect
    public string EmailAddress { get; set; }

    [Required(ErrorMessage = "Name must be provided")]        
    public string Name { get; set; }
}

使用@Html.TextBoxFor 而不是@Html.EditorFor 的视图在您的测试中取出HTML5 客户端验证:

@Html.TextBoxFor(model => model.EmailAddress,....

还有一个像这样的控制器:

public ActionResult CheckUser(User user)
{
    ViewBag.Foo = string.Empty;
    if(Request.HttpMethod == HttpMethod.Post.ToString())
    {
        ViewBag.Foo = ModelState.IsValid ? "User Model validated" : "Failed Model Validation";
    }
    return View();
}

如果你:

  1. 注释掉 [EmailAddress] 属性,只留下[DataType(DataType.EmailAddress)] 你的模型是有效 任何文本(没有电子邮件格式验证)
    • 如果您输入“foo”,则您的模型是“有效的”,没有错误消息。
  2. 保留它,您将获得“服务器端”电子邮件格式验证
    • 如果你放“foo”,它会失败并显示"Not a valid Email"错误信息

第...

【讨论】:

  • 因此,Datatype 通常不会进行服务器端验证,这是正确的吗?而且我不能依赖客户端验证,因为黑客可以绕过客户端验证并向服务器提交错误的值。那么为什么 MSDN 链接提到 Datatype 不应该用于验证?这是正确的吗?
  • @johnG 在任何情况下您都不依赖 客户端 进行验证 :) “从不信任客户端”。不限于“黑客”——例如不进行 HTML5 验证、用户设置等的旧浏览器。
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2020-08-28
  • 2010-10-02
相关资源
最近更新 更多