c# - 为什么电话数据注释不起作用,即使在需要时也是如此?

标签 c# asp.net-mvc validation

我在我的 View 模型中的属性上定义了 [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,所以我已经更新到最新版本以确保它不是特定于版本的。

最佳答案

事实上,它确实有效。问题是 123 是某个地方的有效电话号码……如果您尝试输入字母,您会发现验证失败。但是,如果您输入 (123) 234-2342 它会成功...

这是因为它必须适用于世界各地的电话号码。它甚至必须适用于内部分机(长度很容易为 2、3、4 或 5 位数字)。具体来说,如果你去这里:

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

您会看到正则表达式几乎允许任何数字。如果您想要美国特定电话验证,那么您可能应该只使用正则表达式属性,或基于此开发您自己的 USPhoneAttribute。

关于c# - 为什么电话数据注释不起作用,即使在需要时也是如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22774197/

相关文章:

子对象上的 javax.validation.valid

C# ListView 图像在运行时不显示

c# - 为什么在继承中调用固定数据类型参数的对象类参数方法linseed

c# - 虚拟方法/属性的分支

ASP.NET MVC与Webforms : Replacing WebForms Controls

asp.net-mvc - ApiController 实例何时创建?

c# - 从自定义 AdditionalMetadataAttribute (asp.net mvc 5) 访问模型类实例

ruby-on-rails - 验证包含特定字符串的 Rails

c# - 正确部署了Azure中的所有文件,但仍然无法看到网页

validation - 验证通过第三方后端(自定义 python 后端,非 gae)上的 Google Identity Toolkit (GitkitClient) 在 Android 设备上获取的 OAuth2 token ?