我在视图模型中的属性上定义了[Phone]
数据注释:
public class ContactModel : BaseModel
{
[Required(ErrorMessage = "Please enter your first and last name.")]
[MaxLength(256, ErrorMessage = "Your name is too long, the maximum is 256 character.")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter your email address.")]
[EmailAddress(ErrorMessage = "Please enter a valid email address.")]
[MaxLength(256, ErrorMessage = "Your email address is too long, the maximum is 256 character.")]
[Display(Name = "Email Address")]
public string Email { get; set; }
[Phone(ErrorMessage = "Please enter a valid phone number.")]
[Display(Name = "Phone Number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please enter your comments or request.")]
[Display(Name = "Comments or Request")]
public string Comments { get; set; }
}
但它没有像[Email]
注释那样验证格式;即使[Required]
。例如,如果我输入文字123
,ModelState.IsValid
仍然是true
,因为该属性不会验证输入。为了增加对伤害的侮辱,客户端没有任何事情像电子邮件地址那样发生。如果我输入无效的电子邮件地址,我实际上会得到JavaScript验证 - 正如预期的那样。
发生了什么?
我使用的是Mvc 5.1.0.0,所以我已经更新到最新版本,以确保它不是特定于版本的。
答案 0 :(得分:4)
事实上它确实有效。问题是123是一个有效的电话号码,某处...如果您尝试输入字母,您会注意到验证失败。但是,如果你输入(123)234-2342它就会成功......
这是因为它必须适用于全世界的电话号码。它甚至必须适用于内部扩展(可以很容易地为2,3,4或5位长)。具体来说,如果你去这里:
你会发现正则表达式允许任何数字。如果您想要美国特定电话验证,那么您应该只使用正则表达式属性,或者根据此属性开发自己的USPhoneAttribute。