2012-10-19 33 views
4

我們不使用System.ComponentModel.DataAnnotations名稱空間中的默認dataannotation屬性,但構建了自定義屬性。在使用自定義[required]屬性時使用客戶端驗證

所以我們在屬性上放置了一個[required]屬性,但它是一個定製的屬性。

對於服務器端驗證,我們設法覆蓋了使用自定義驗證提供程序的驗證,但我們堅持使用客戶端驗證。

正如我在文檔閱讀,我看到,當您使用默認[required]屬性,這些類型的屬性呈現在html元素:

data-val-lengthmax="10" data-val-length-min="3" data-val-required="The ClientName field is required." 

我相信這是由框架,做這讀取正常的required屬性,然後呈現html屬性。

我們可以讓框架爲我們渲染這些屬性嗎?

回答

4

我們可以讓框架爲我們渲染這些屬性嗎?

是的,有兩種可能性:

  1. 讓你的自定義屬性實現IClientValidatable界面,你將實現客戶端驗證規則。
  2. 註冊一個自定義DataAnnotationsModelValidator<TAttribute>其中TAttribute將是您的自定義驗證屬性,以及您將實現自定義客戶端驗證規則的位置(這是Microsoft爲實現Required屬性實現客戶端驗證所使用的方法,這就是爲什麼如果您編寫自定義驗證器屬性,從它派生你沒有得到客戶端驗證)。然後,您需要使用DataAnnotationsModelValidatorProvider.RegisterAdapter調用註冊自定義模型驗證程序。
+0

因此,在本例中(來自本書)'data-val =「true」data-val-length =「字段ClientName 必須是最小長度爲3,最大長度爲10的字符串。 data-val-lengthmax =「 10」data-val-length-min =「3」data-val-required =「客戶端名稱字段是必需的。」我必須知道哪些數據val屬性存在,並且當框架改變它的行爲時(可能會添加/刪除'data-val'屬性),監視它並在我們自己的代碼中實現它們? – Michel

+0

'data-val'屬性將由HTML助手(如TextBoxFor)自動生成,假定您的裝飾的自定義驗證屬性相應的視圖模型屬性滿足我在我的答案中提出的兩個條件之一。 –

2

爲了能在自定義客戶端驗證屬性,你可以實現你的屬性IClientValidatable接口:

public class requiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    ... 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } }; 
    } 
} 

作爲替代方案可以實現驗證適配器的屬性:

public class requiredAttributeAdapter : DataAnnotationsModelValidator<requiredAttribute> 
{ 
    public requiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute) 
     : base(metadata, context, attribute) 
    { } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } }; 
    } 
} 

並在Global.asax中用數據註釋驗證引擎註冊它:

protected void Application_Start() 
{ 
    ... 
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(requiredAttribute), typeof(requiredAttributeAdapter)); 
} 

當然,你需要確保你在上面的類中引用了你的屬性。

相關問題