2011-08-22 11 views
4

我正在使用viewmodels上的DataAnnotation屬性的一些代碼,並在某些情況下以編程方式覆蓋某些屬性。在代碼中設置StringLengthAttribute的MaximumLength代碼

更改ErrorMessage關於ValidationAttributes各種類型,沒問題。

更改DataFormatStringDisplayFormatAttributes,沒問題。

MinimumLength更改爲StringLengthAttribute,沒問題。但是.. MaximumLength沒有公共二傳手!?

有沒有什麼理由爲什麼這一個財產突出作爲一個私人二傳手,當它周圍是公開的?是否有任何解決方法可以用編程方式更改StringLengthAttribute的最大長度?

+0

感謝您的答案 - 但是,我落得這樣做實現自己的定製驗證特性,我們稱之爲'MyStringLengthAttribute',這是在功能上架構的一個相同,但是與公共'MaximumLength'屬性。現在一切正常。 – Carson63000

回答

3

由於設置MaximumLength屬性的唯一公共方法是通過屬性構造函數,所以沒有編程方式來在構建後更改它。假設你以足夠的信任運行代碼,你總是可以使用私人反射來做你需要的。如果您不想(或不能)走這條路線,另一個選擇是在給定條件下交換視圖模型,而不是根據需要更新屬性。然後,您可以爲每個單獨的視圖模型構造所需的屬性,而不必擔心以編程方式更改屬性本身。

最後一個選擇是實際編寫自己的StringLength屬性。你幾乎可以easliy模仿的內置版本的功能,因爲它的IsValid()方法真是簡單:

public override bool IsValid(object value) 
{ 
    int num = (value == null) ? 0 : ((string)value).Length; 
    return value == null || (num >= this.MinimumLength && num <= this.MaximumLength); 
} 

Mimicing如此,但包括public二傳手在MaximumLength財產應該得到你所需要的。

1

假設你正在使用一個定製ModelMetadataValidatorProvider,正如我在How to add validation attribute to model property in TemplateEditor in MVC3概述,在你的GetValidators方法的覆蓋,可以通過底座方法返回的驗證迭代,刪除當前StringLengthAttribute,並替換你的StringLengthAttribute,與所需的MaxLength值。

+0

我給了這個想法一個嘗試,並在我的自定義ModelMetadataValidatorProvider,我可以檢索'StringLengthAttributeAdapter'但其Attribute屬性是受保護的,所以我不能在原始屬性的最小長度和錯誤消息,構造一個新的屬性的最大長度不同。 – Carson63000

0

由於此代碼是特定於viewmodel的,所以您的ViewModel實現了IValidateableObject接口並在此處進行驗證。

 

public IEnumerable Validate(ValidationContext validationContext) 
{ 
    if (YourField.Length == 2) 
    { 
     yield return new ValidationResult("ut oh!!"); 
    } 
}