2012-11-01 93 views
1

我試圖通過Unobtrusive AJAX表單在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" /> 
<%}%> 

我已經包含了所需的.js文件和其他客戶端驗證適用於具有[必需]屬性以及自定義字段驗證屬性。

請建議爲什麼它不能用於PhoneNumber字段?

謝謝,

回答

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


} 
+0

感謝您的回覆利亞姆。我正在考慮用這個自定義驗證屬性註冊驗證,但我沒有。這是因爲,我有更多的自定義屬性爲我的模型字段,並沒有註冊使用JavaScript的作品。我剛剛在MVC 3中讀到,我們可以通過實現IClientValidatable來註冊客戶端驗證。如果我錯了,請糾正。乾杯 – jNet

+0

不,你仍然需要在JavaScript中註冊它。 IClientValidatable僅定義了一種更簡單的方法來定義驗證屬性,因爲過去實施驗證規則非常繁瑣 – Liam

+0

已添加更新 – Liam