我试图了解使用之间的主要区别
[DataType(DataType.EmailAddress)]
& [EmailAddress]
。
在模型类中: -
public class MYViewModel {
[DataType(DataType.EmailAddress)] OR [EmailAddress]
public string Email { get; set; }
我做了一个测试,这两个属性将执行以下操作: -
会阻止用户添加invalud电子邮件地址
会将值显示为" EmailTo:..."
但是我找不到有关功能的任何差异,当然如果我使用html.TextboxFor
那么Datatype
将没有任何效果,而如果我使用html.EditorFor
那么数据类型数据注释将起作用,但我在谈论技术实现方面的差异?
答案 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();
}
如果你:
[EmailAddress]
属性,只留下[DataType(DataType.EmailAddress)]
您的模型有效包含任何文字(无电子邮件格式验证)
"Not a valid Email"
错误消息... H个