2011-01-23 10 views
8

を動作していないように見えるデータの注釈と私のテストクラスである:ここでStringLengthAttributeはここ

class Test 
{ 
    [Required, StringLength(10)] 
    public string MyProperty { get; set; } 
} 

は私のコンソールのテストプログラムです:

class Program 
{ 
    static void Main(string[] args) 
    { 
    var test = new Test { 
     MyProperty = "this is way more than 10 characters and should fail." 
    }; 

    var context = new ValidationContext(test, null, null); 

    // No exception here! (why not?) 
    Validator.ValidateObject(test, context); 

    test.MyProperty = null; 

    // Exception here, as expected 
    Validator.ValidateObject(test, context); 
    } 
} 

が何らかの理由で、私は得ることはありません文字列の長さが長すぎると、検証例外が発生します。プロパティをnullに設定して再検証すると、(期待どおりの)検証例外が発生します。私の文字列の長さの注釈が強制されていない理由は何ですか?

答えて

19

それは少し非直感的だが、

Validator.ValidateObject(test, context, true); 

Validator.ValidateObject(test, context); 

を変更すると、問題を解決します。 3番目の引数はbool validateAllPropertiesです。私はなぜ[Required]属性が以前に強制されていたのかわかりませんが、[StringLength]はありませんでしたが、少なくとも今はすべて動作しています。

3

ありがとうございます。私はこの問題についてMicrosoft Connectにバグを投稿しました。 「validateAllProperties」パラメータなしで深い/再帰的な検証を行わないため、値の型ではないため、System.Stringプロパティを間違ってスキップしていると想定します。

興味のある方は、こちらのバグリンクをご覧ください: https://connect.microsoft.com/VisualStudio/feedback/details/672247/system-componentmodel-dataannotations-validator-does-not-validate-stringlengthattribute-unless-validateallproperties-specified