【问题标题】:Unobtrusive AJAX doesn't validate Custom attribute for 'Not Required' fieldUnobtrusive AJAX 不验证“不需要”字段的自定义属性
【发布时间】:2012-11-01 14:20:48
【问题描述】:

我正在尝试在 MVC 3 中通过 Unobtrusive AJAX 表单实现客户端验证。

    public class PhoneNumberAttribute : RegularExpressionAttribute, IClientValidatable
{
    private const string Message = " must be a valid phone number";
    public PhoneNumberAttribute()
        : base(@"^[\s\d\+\(\)]+$")
    {
        ErrorMessage = "{0}" + Message;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new List<ModelClientValidationRule>() {
            new ModelClientValidationRule{
                ValidationType="phonenumber",
                  ErrorMessage= metadata.DisplayName + " " + Message
            } 
        };
    }
}

型号:

 public class MyModel
{
    [DisplayName("Phone Number")]        
    [PhoneNumber]
    public string PhoneNumber{ get; set; }
 }

HTML

 <% using (Ajax.BeginForm("Contact", new AjaxOptions() { UpdateTargetId = "ajaxcontactform", 
     OnBegin = "ShowProcessing", 
     OnComplete = "HideProessing",
     InsertionMode = InsertionMode.Replace
 }))
 {%>
           <%: Html.ValidationSummary()%>

 <%: Html.TextBoxFor(m => m.PhoneNumber, new { Class = "contacttextform" })%>
 <input id="sendBtn" name="send" type="submit" class="contactformbutton" value="Send" />
<%}%>

我已经为具有 [Required] 属性以及自定义验证属性的字段包含了必需的 .js 文件和其他客户端验证工作。

请说明为什么它不适用于 PhoneNumber 字段?

谢谢,

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    C# 代码只是验证的一方面。您所做的一切都是定义元数据来执行验证。您还需要使用不显眼的 JavaScript 注册验证,在 JavaScript 中,请参阅

    Unobtrusive validation of collection

    http://odetocode.com/Blogs/scott/archive/2011/02/22/custom-data-annotation-validator-part-ii-client-code.aspx

    编辑 看了之后,我想知道你是否在想这个。我不明白你为什么需要IClientValidatable,因为你所做的一切都是从RegularExpressionAttribute继承的,试试下面的:

    public class PhoneNumberAttribute : RegularExpressionAttribute
    {
        private const string Message = " must be a valid phone number";
        public PhoneNumberAttribute()
            : base(@"^[\s\d\+\(\)]+$")
        {
            ErrorMessage = "{0}" + Message;
        }
    
    
    }
    

    【讨论】:

    • 感谢利亚姆的回复。我正在考虑使用不显眼的 JavaScript 为这个自定义验证属性注册验证,但我没有。这是因为,我的模型字段有更多自定义属性,并且无需使用 javascript 注册即可使用。我刚刚读到在 MVC 3 中我们可以通过实现 IClientValidatable 来注册客户端验证。如果我错了,请纠正。干杯
    • 不,您仍然需要在 JavaScript 中注册它。 IClientValidatable 只定义了一种更简单的方法来定义您的验证属性,因为它过去实现验证规则非常繁琐
    猜你喜欢
    • 2014-03-27
    • 2018-09-11
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多