为什么即使在需要时,电话数据注释也不起作用?

时间:2014-03-31 23:34:43

标签: c# asp.net-mvc validation

我在视图模型中的属性上定义了[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]。例如,如果我输入文字123ModelState.IsValid仍然是true,因为该属性不会验证输入。为了增加对伤害的侮辱,客户端没有任何事情像电子邮件地址那样发生。如果我输入无效的电子邮件地址,我实际上会得到JavaScript验证 - 正如预期的那样。

发生了什么?

我使用的是Mvc 5.1.0.0,所以我已经更新到最新版本,以确保它不是特定于版本的。

1 个答案:

答案 0 :(得分:4)

事实上它确实有效。问题是123是一个有效的电话号码,某处...如果您尝试输入字母,您会注意到验证失败。但是,如果你输入(123)234-2342它就会成功......

这是因为它必须适用于全世界的电话号码。它甚至必须适用于内部扩展(可以很容易地为2,3,4或5位长)。具体来说,如果你去这里:

http://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/PhoneAttribute.cs

你会发现正则表达式允许任何数字。如果您想要美国特定电话验证,那么您应该只使用正则表达式属性,或者根据此属性开发自己的USPhoneAttribute。