Validation 电子邮件数据注释验证有效,但手机无法';T

Validation 电子邮件数据注释验证有效,但手机无法';T,validation,asp.net-mvc-4,Validation,Asp.net Mvc 4,我在ASP.NET MVC4项目中使用数据注释对电子邮件和电话字段执行客户端验证。电子邮件正在客户端中成功验证,但手机没有-它允许我输入无效字符,并且只在提交表单时发出警告(而不是在键入字符后立即发出警告) 在模型中: [Required(ErrorMessage = "Email is required")] [DataType(DataType.EmailAddress)] [EmailAddress] [Display(Name = "Email")] public string Emai

我在ASP.NET MVC4项目中使用数据注释对电子邮件和电话字段执行客户端验证。电子邮件正在客户端中成功验证,但手机没有-它允许我输入无效字符,并且只在提交表单时发出警告(而不是在键入字符后立即发出警告)

在模型中:

[Required(ErrorMessage = "Email is required")]
[DataType(DataType.EmailAddress)]
[EmailAddress]
[Display(Name = "Email")]
public string Email{ get; set; }

[Required(ErrorMessage = "Mobile is required")]
[DataType(DataType.PhoneNumber)]
[Phone]
[Display(Name = "Mobile number")]
public string Mobile { get; set; }
在视图中,我相信我包含了正确的脚本引用:

<script type="text/javascript" src="~/Scripts/jquery.validate.min.js" ></script
<script type="text/javascript" src="~/Scripts/jquery.validate.unobtrusive.min.js" ></script>

我错过了什么

我认为问题在于电话类型不受支持。 看


它将匹配诸如:0123456789、012-345-6789、(012)-345-6789等数字。

MVC 4有一个内置的EmailAddress显示模板,但没有PhoneNumber。 您需要为
[DataType(DataType.PhoneNumber)]
创建自定义显示模板

添加以下文件(您可能需要创建子文件夹DisplayTemplates):
Views\Shared\DisplayTemplates\PhoneNumber.cshtml

@model System.String
@if (Model != null)
{
    @:@System.Text.RegularExpressions.Regex.Replace(@Model, "(\\d{3})(\\d{3})(\\d{4})", "$1-$2-$3")
}

使用EditorFor代替TextBoxFor发送电子邮件,然后在电子邮件字段中给出错误ok键。

也许最好询问OP(使用注释)正在使用的电话类型;这可能是一个受支持的类型,在这种情况下,这不是答案…@OzAnt-你是说我应该使用new type=“tel”而不是type=“phone”?@LiamWeston-不完全是:W3学校说HTML5定义了type=tel的电话输入类型,而不是phone,但任何浏览器都不支持这种类型(我猜每个国家的电话号码都不一样)。因此,您最好在模型中使用自己的正则表达式验证您的电话号码,并将其应用到客户端。看起来这更像是一个提示,因为iPhone识别type=“tel”,并将键盘完全改为标准电话键盘请参见[链接]谢谢-这就是我得出的结论。@Html.LabelFor(model=>model.Email)@Html.ValidationMessageFor(model=>model.Email)@Html.EditorFor(model=>model.Email)将此用于电子邮件验证
[Required(ErrorMessage = "Mobile is required")]
[RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Entered mobile format is not valid.")]
public string Mobile{get; set;}
@model System.String
@if (Model != null)
{
    @:@System.Text.RegularExpressions.Regex.Replace(@Model, "(\\d{3})(\\d{3})(\\d{4})", "$1-$2-$3")
}