【问题标题】:MVC client side validation for PhoneAttributePhoneAttribute 的 MVC 客户端验证
【发布时间】:2014-06-11 17:18:17
【问题描述】:

我有一个模型:

public class MyModel{
    [Phone]
    public string MyTel { get; set; }
}

在视图中:

@model MyModel
@Html.EditorFor(x => x.MyTel)

生成的 HTML:

<input type="tel" value="" name="MyTel" id="MyTel" data-val-phone="The MyTel field is not a valid phone number." data-val="true" class="text-box single-line"/>

MyTel 字段的客户端验证不起作用。如何使这项工作?

【问题讨论】:

    标签: javascript asp.net-mvc forms data-annotations unobtrusive-validation


    【解决方案1】:

    我在项目中为 PhoneAttribute 应用的最简单的解决方案:

    第 1 步:添加这些注释

    public class MyModel{
        [Required(ErrorMessage = "You must provide a mobile number")]
        [Phone]
        [MaxLength(13)] //custom maximum length enabled
        [MinLength(10)]//custom minimum length enabled
        [RegularExpression("^[0-9]*$", ErrorMessage = "mobile number must be 
        numeric")]
        public string MyTel { get; set; }
    } 
    

    第 2 步:添加这两个库

    <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.js"></script>
    <script src="//ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.js"></script>
    

    第 3 步:在 Web.config 下的 appSettings 添加

     <add key="ClientValidationEnabled" value="true"/>
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    

    注意:不要混淆 mvc html 帮助程序和原始 html,它可能会禁用客户端验证。

    【讨论】:

      【解决方案2】:

      文章Adding Client-Side Validation Support for PhoneAttribute or Fighting the Lookbehind in JavaScript指导

      function initPhoneValidator() {
          $.validator.addMethod("phone", function (value, element) {
              if (this.optional(element)) {
                  return true;
              }
              var reverseValue = $.trim(value).split("").reverse().join("");
              var reverseRegEx = new RegExp("^(\\d+\\s?(x|\\.txe?)\\s?)?((\\)(\\d+[\\s\\-\\.]?)?\\d+\\(|\\d+)[\\s\\-\\.]?)*(\\)([\\s\\-\\.]?\\d+)?\\d+\\+?\\((?!\\+.*)|\\d+)(\\s?\\+)?$", "i");
              var match = reverseRegEx.exec(reverseValue);
              return (match && (match.index === 0) && (match[0].length === value.length));
          });
          $.validator.unobtrusive.adapters.addBool("phone");
      }
      

      【讨论】:

      • 谢谢。一条评论:我认为if (this.optional(...)) 检查不应该在这里。如果需要,属性上还应该有一个[Required] 属性。这段代码现在的方式是,不会对非必需属性进行验证,这很可能不是人们所期望的。如果我错了,请纠正我!
      • 这个正则表达式不能正常工作。例如,123 在不应该的情况下通过了此测试。我最终将您的解决方案与这个结合起来:stackoverflow.com/a/4338631/374198
      猜你喜欢
      • 2012-07-29
      • 2010-09-14
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多