[DataType(DataType.EmailAddress)]&和[DataType(DataType.EmailAddress)]之间有什么区别? [电子邮件地址]

时间:2014-10-11 15:59:37

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

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

在模型类中: -

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

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

  1. 会阻止用户添加invalud电子邮件地址

  2. 会将值显示为" EmailTo:..."

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

1 个答案:

答案 0 :(得分:3)

希望这澄清......

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

  • @Html.EditorFor呈现HTML5 <input type="email" ....,它会延迟到客户端/浏览器进行验证。如果浏览器符合,则发生客户端验证。它会&#34;工作&#34;因为客户端为您验证了它(但服务器端验证)

您可以在视图中将@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)]您的模型有效包含任何文字(无电子邮件格式验证)
    • 如果你把&#34; foo&#34;你的模型是&#34;有效&#34;,没有错误信息。
  2. 留下它,你会得到服务器端&#34;电子邮件格式验证
    • 如果您输入&#34; foo&#34;,它将失败并显示"Not a valid Email"错误消息
  3. ... H个