C# 电话号码验证MVC

C# 电话号码验证MVC,c#,regex,asp.net-mvc,jquery-validate,validationattribute,C#,Regex,Asp.net Mvc,Jquery Validate,Validationattribute,我试图使用正则表达式验证电话号码,并在提交无效号码或电话号码时返回错误 MVC代码: 电话号码: @Html.TextBoxFor(model=>model.PhoneNumber,新的{@class=“textbox”}) @Html.ValidationMessageFor(model=>model.PhoneNumber) C#代码: [数据类型(数据类型.电话号码)] [显示(Name=“电话号码”)] [必需(ErrorMessage=“需要电话号码!”)] [正则表达式(@“

我试图使用正则表达式验证电话号码,并在提交无效号码或电话号码时返回错误

MVC代码


电话号码:
  • @Html.TextBoxFor(model=>model.PhoneNumber,新的{@class=“textbox”}) @Html.ValidationMessageFor(model=>model.PhoneNumber)
  • C#代码

    [数据类型(数据类型.电话号码)]
    [显示(Name=“电话号码”)]
    [必需(ErrorMessage=“需要电话号码!”)]
    [正则表达式(@“^\(([0-9]{3})\)?[-.]([0-9]{3})[-.]?([0-9]{4})$”,
    ErrorMessage=“输入的电话格式无效。”)]
    公共字符串PhoneNumber{get;set;}
    

    但是,输入框不会向用户显示消息,表明提交的电话号码无效。

    页面上没有验证程序。添加类似这样的内容以显示验证消息

    @Html.ValidationMessageFor(model => model.PhoneNumber, "", new { @class = "text-danger" })
    
    型号

    [Required(ErrorMessage = "You must provide a phone number")]
    [Display(Name = "Home Phone")]
    [DataType(DataType.PhoneNumber)]
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Not a valid phone number")]
    public string PhoneNumber { get; set; }
    
    查看:

    @Html.LabelFor(model => model.PhoneNumber)
    @Html.EditorFor(model => model.PhoneNumber)
    @Html.ValidationMessageFor(model => model.PhoneNumber)
    

    连同以上的答案 对于“最小长度”和“最大长度”,请尝试以下操作:

    模型中

    [StringLength(13, MinimumLength=10)]
    public string MobileNo { get; set; }
    
    鉴于

     <div class="col-md-8">
               @Html.TextBoxFor(m => m.MobileNo, new { @class = "form-control" , type="phone"})
               @Html.ValidationMessageFor(m => m.MobileNo,"Invalid Number")
               @Html.CheckBoxFor(m => m.IsAgreeTerms, new {@checked="checked",style="display:none" })
      </div>
    
    
    @TextBoxFor(m=>m.MobileNo,新的{@class=“formcontrol”,type=“phone”})
    @Html.ValidationMessageFor(m=>m.MobileNo,“无效数字”)
    @CheckBoxFor(m=>m.IsAgreeTerms,新的{@checked=“checked”,style=“display:none”})
    
    要以(########-####格式显示电话号码,可以创建新的HtmlHelper

    用法 HtmlHelper扩展
    公共静态类HtmlHelperExtensions
    {
    公用静态HtmlString DisplayForPhone(此HtmlHelper助手,字符串电话)
    {
    如果(电话==null)
    {
    返回新的HtmlString(string.Empty);
    }
    字符串格式=电话;
    如果(phone.Length==10)
    {
    格式化=$“({phone.Substring(0,3)}{phone.Substring(3,3)}-{phone.Substring(6,4)}”;
    }
    else if(phone.Length==7)
    {
    格式化=$“{phone.Substring(0,3)}-{phone.Substring(3,4)}”;
    }
    字符串s=$“”;
    返回新的HtmlString;
    }
    }
    
    尝试为Mobile No

    [Required (ErrorMessage="Required")]
    [RegularExpression(@"^(\d{10})$", ErrorMessage = "Wrong mobile")]
    public string Mobile { get; set; }
    
    试试这个:

    [DataType(DataType.PhoneNumber, ErrorMessage = "Provided phone number not valid")]
    

    或者您可以使用JQuery—只需将您的输入字段添加到类“phone”中,并将其放入脚本部分:

    $(".phone").keyup(function () {
            $(this).val($(this).val().replace(/^(\d{3})(\d{3})(\d)+$/, "($1)$2-$3"));
    
    没有错误消息,但您可以看到,在输入全部十位数字之前,电话号码的格式不正确。

    [DataType(DataType.PhoneNumber)]
    没有任何现成的验证逻辑

    根据报告:

    DataTypeAttribute
    属性应用于数据字段时,必须执行以下操作:

    • 根据需要发布验证错误
    [Phone]
    属性继承自
    [DataType]
    ,并在.NET Framework 4.5+中引入,位于.NET Core中,它提供了自己的验证逻辑风格。所以你可以这样使用:

    [Phone()]
    公共字符串PhoneNumber{get;set;}
    
    但是,电话号码的开箱即用验证是,因此您可能会发现自己想要从数据类型继承并实现自己的
    IsValid
    方法,或者,如其他人所建议的,使用&
    RegexValidator
    来约束输入


    注意:请谨慎使用正则表达式,以防根据as.NET进行无约束输入。

    电话号码数据注释属性用于数据类型,与数据显示格式无关。这只是个误会。电话号码表示您可以接受用于此区域设置的电话号码的号码和符号,但不检查格式、长度、范围或其他。对于显示字符串格式,请使用javascript进行更动态的用户交互,或者使用MVC掩码插件,或者只正确使用显示格式字符串

    如果您是MVC编程新手,请将此代码放在视图文件(.cshtml)的最末尾,并查看以下神奇之处:

    <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#the_id_of_your_field_control").keyup(function () {
                $(this).val($(this).val().replace(/^(\d{2})(\d{5})(\d{4})+$/, "($1) $2-$3"));
            });
        });
    </script>
    
    
    $(文档).ready(函数(){
    $(“#您的_字段_控件的_id_”).keyup(函数(){
    $(this.val($(this.val()).replace(/^(\d{2})(\d{5})(\d{4})+$/,“($1)$2-$3”);
    });
    });
    
    这种格式目前用于巴西的移动电话。适应你的标准


    这将在字段中添加括号和空格,从而增加输入数据的字符串长度。如果只想保存数字,则必须在保存之前从字符串中删除非数字。

    那么会出现什么问题,我的意思是你在哪里需要帮助?输入框不会向用户显示消息,表明提交的电话号码无效。有效电话号码的标准是什么?10位数字和标准美国电话号码。当然可以。如果它解决了您的问题,请确保将此标记为答案。欢迎来到堆栈溢出!对于,如何显示?它可以将像8005551212这样的字符串转换为(800)555-1212吗?仅此数据注释是不够的吗?[数据类型(数据类型.电话号码)]。如果我们需要正则表达式进行验证,那么为什么我们需要DataType.PhoneNumber。它的用途是什么?很明显,因为不是每个国家都有相同的电话号码格式。如果必须提供进行电话号码验证的正则表达式,[DataType(DataType.PhoneNumber)]属性的用途是什么?作为一个更容易阅读的行,我使用以下代码来格式化10位电话号码:
    string.format({0:(#######-#########,phone)
    使用C#6+,您也可以使用您的子字符串方法:
    格式化=$”({phone.Substring(0,3)}phone.Substring(3,3)}-{phone.Substring(6,4)},前面格式化的字符串表示$,以及如何在中放置值调用(方法、属性等)
    
    $(".phone").keyup(function () {
            $(this).val($(this).val().replace(/^(\d{3})(\d{3})(\d)+$/, "($1)$2-$3"));
    
    <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#the_id_of_your_field_control").keyup(function () {
                $(this).val($(this).val().replace(/^(\d{2})(\d{5})(\d{4})+$/, "($1) $2-$3"));
            });
        });
    </script>