不引人注目的AJAX不会为“不需要”字段验证自定义属性

时间:2012-11-01 14:20:48

标签: asp.net-mvc-3

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

    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字段?

谢谢,

1 个答案:

答案 0 :(得分:0)

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;
    }


}