0

Enterpirse Library 検証を使用しているときに、ネストされたオブジェクトを含むオブジェクトを検証するときにルールセットを適用する際に問題が発生します。次のオブジェクトがある場合

public class Person
{
    [ObjectValidator]
    [ObjectValidator(Ruleset = "A")]
    public Address Address  { get; set; }
}

public class Address  
{
    [StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}")]
    public string Address1 { get; set; }

    [StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}", Ruleset = "A")]
    public string Address2 { get; set; }
}

呼び出してオブジェクトを検証しようとすると

ValidationResults results = Validation.Validate(myPersonObject);

期待どおりにデフォルトの検証を取得します。つまり、Person.Address.Address1 が長すぎる場合は起動しますが、Person.Address.Address2 は無視されます。これは期待どおりです。

ただし、次のようにルールセット「A」の検証を呼び出そうとすると

ValidationResults results = Validation.Validate(myPersonObject, "A");

ルールセットを指定したにもかかわらず、常に前の検証呼び出しと同じ結果が得られます。助言がありますか?

4

1 に答える 1

1

そのため、ObjectValidator 属性のコンストラクターでルールセットを渡し、期待される動作を得るためにルールセット プロパティを指定する必要があることがわかりました。

public class Person
{
    [ObjectValidator]
    [ObjectValidator("A", Ruleset = "A")]
    public Address Address  { get; set; }
}

public class Address  
{
    [StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}")]
    public string Address1 { get; set; }

    [StringLengthValidator(0, 32, MessageTemplate = "Invalid value '{0}' for {1}, Max length:{5}", Ruleset = "A")]
    public string Address2 { get; set; }
}

基本的に、コンストラクター引数はターゲット オブジェクト ("Address") のターゲット ルールセットであり、Ruleset 名前付きパラメーターは現在のオブジェクト ("Person") でルールセットが呼び出されるものです。

于 2013-03-11T10:06:38.523 に答える