【问题标题】:Phone Number Validation MVC电话号码验证 MVC
【发布时间】:2015-05-08 09:57:00
【问题描述】:

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

MVC 代码

<ol class="row">
    <li class="cell" style="width: 20%;">Phone Number:</li>
    <li class="cell last" style="width: 60%;">
        @Html.TextBoxFor(model => model.PhoneNumber, new { @class = "textbox" }) 
        @Html.ValidationMessageFor(model => model.PhoneNumber)
    </li>
</ol>

C# 代码

[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone Number")]
[Required(ErrorMessage = "Phone Number Required!")]
[RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$",
                   ErrorMessage = "Entered phone format is not valid.")]
public string PhoneNumber { get; set; }

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

【问题讨论】:

  • 那么问题来了,我的意思是你在哪里需要帮助?
  • 输入框不会向用户显示提交的电话号码无效的消息。
  • 有效电话号码的标准是什么?
  • 10 位数字和标准美国电话号码。

标签: c# regex asp.net-mvc jquery-validate validationattribute


【解决方案1】:

电话号码数据注解属性为数据类型,与数据显示格式无关。这只是一个误解。电话号码意味着您可以接受用于此语言环境的电话号码的数字和符号,但不检查格式、长度、范围等。对于显示字符串格式,请使用 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>

这种格式目前用于巴西的手机。适应您的标准。

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

【讨论】:

  • 如果您在同一个视图中有多个电话字段,您可以更改类名称的#the_id_of_your_field_control,如上面使用的@Thomas-Fonseca 的“.the_phone_class_name”,将解决方案分布在所有字段中那个班级。
【解决方案2】:

[DataType(DataType.PhoneNumber)] 没有任何开箱即用的验证逻辑。

根据docs

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

  • 酌情发出验证错误。

[Phone] 属性继承自 [DataType],并在 .NET Framework 4.5+ 中引入,并且在 .NET Core 中提供了自己的验证逻辑风格。所以你可以这样使用:

[Phone()]
public string PhoneNumber { get; set; }

但是,电话号码的开箱即用验证是 pretty permissive,因此您可能会发现自己想要从 DataType 继承并实现自己的 IsValid 方法,或者正如其他人在这里建议的那样,使用regular expression & RegexValidator 限制输入。

注意:根据best practices 对Regex 进行无约束输入时要小心,因为.NET 已将pivot away from regular expressions in their own internal validation logic for phone numbers 设为

【讨论】:

    【解决方案3】:

    型号

    [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)
    

    【讨论】:

    • DisplayFor 怎么样?能不能把像8005551212这样的字符串转换成(800) 555-1212
    • 仅此 DataAnnotation 还不够吗? [数据类型(数据类型。电话号码)]。如果我们需要正则表达式进行验证,那么为什么我们需要 DataType.PhoneNumber。目的是什么?
    • 很明显,因为并非每个国家/地区都有相同格式的电话号码
    • 如果您必须提供进行电话号码验证的正则表达式,那么 [DataType(DataType.PhoneNumber)] 属性的用途是什么?
    【解决方案4】:

    要以 (###) ###-#### 格式显示电话号码,您可以创建一个新的 HtmlHelper。

    用法

    @Html.DisplayForPhone(item.Phone)
    

    HtmlHelper 扩展

    public static class HtmlHelperExtensions
    {
        public static HtmlString DisplayForPhone(this HtmlHelper helper, string phone)
        {
            if (phone == null)
            {
                return new HtmlString(string.Empty);
            }
            string formatted = phone;
            if (phone.Length == 10)
            {
                formatted = $"({phone.Substring(0,3)}) {phone.Substring(3,3)}-{phone.Substring(6,4)}";
            }
            else if (phone.Length == 7)
            {
                formatted = $"{phone.Substring(0,3)}-{phone.Substring(3,4)}";
            }
            string s = $"<a href='tel:{phone}'>{formatted}</a>";
            return new HtmlString(s);
        }
    }
    

    【讨论】:

    • 作为一个更易于阅读的行,我使用以下代码来格式化 10 位电话号码:string.Format("{0:(###) ###-####}", phone) 对于 C# 6+,您还可以使用您的 Substring 方法:formated = $"({phone.Substring(0,3)}) {phone.Substring(3,3)}-{phone.Substring(6,4)}"注意前面的 $ 表示它是一个格式化字符串,以及如何在 {brackets} 中进行值调用(方法、属性等)
    • 你应该提供这个作为答案安德鲁。我会投票赞成! :)
    • 我不想跳过你的解决方案,因为它对我有帮助。没有真正的功能变化,它只是读起来更容易一些。我编辑了你的回复。
    【解决方案5】:

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

    $(".phone").keyup(function () {
            $(this).val($(this).val().replace(/^(\d{3})(\d{3})(\d)+$/, "($1)$2-$3"));
    

    没有错误消息,但您可以看到电话号码的格式不正确,直到您输入所有十位数字。

    【讨论】:

      【解决方案6】:

      试试这个:

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

      【讨论】:

      • 仅此一项是行不通的。我还必须添加正则表达式检查。
      【解决方案7】:

      试试手机号的简单正则表达式

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

      【讨论】:

        【解决方案8】:

        连同上述答案 试试这个最小和最大长度:

        在模型中

        [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>
        

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

          • 当然可以。如果它解决了您的问题,请务必将其标记为答案。欢迎来到 Stack Overflow!
          猜你喜欢
          • 1970-01-01
          • 2012-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-03
          • 2011-09-05
          相关资源
          最近更新 更多