SORU
3 AĞUSTOS 2010, Salı


İValidatableObject nasıl kullanırım?

IValidatableObject hadi birbirinize karşı özelliklerini karşılaştıran bir şekilde bir nesne doğrulamak için kullanılır anlıyorum.

Hala nitelikler bireysel özelliklerini doğrulamak için almak istiyorum, ama bazı durumlarda bazı özellikleri hataları görmezden gelmek istiyorum.

Yanlış durumda kullanmaya altında mıyım? Bunu nasıl uygularım?

public class ValidateMe : IValidatableObject
{
[Required]
public bool Enable { get; set; }

[Range(1, 5)]
public int Prop1 { get; set; }

[Range(1, 5)]
public int Prop2 { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (!this.Enable)
    {
        /* Return valid result here.
         * I don't care if Prop1 and Prop2 are out of range
         * if the whole object is not "enabled"
         */
    }
    else
    {
        /* Check if Prop1 and Prop2 meet their range requirements here
         * and return accordingly.
         */ 
    }
}
}

CEVAP
3 AĞUSTOS 2010, Salı


Öncelikle, @paper1337 doğru kaynakları için beni işaret için teşekkürler...ona oy ne kadar kayıtlı değilim, lütfen bunu başka yazıyorsa bunu yapın.

Yapmaya çalıştığım şeyi başarmak için.

Sınıf Validatable:

public class ValidateMe : IValidatableObject
{
    [Required]
    public bool Enable { get; set; }

    [Range(1, 5)]
    public int Prop1 { get; set; }

    [Range(1, 5)]
    public int Prop2 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        if (this.Enable)
        {
            Validator.TryValidateProperty(this.Prop1,
                new ValidationContext(this, null, null) { MemberName = "Prop1" },
                results);
            Validator.TryValidateProperty(this.Prop2,
                new ValidationContext(this, null, null) { MemberName = "Prop2" },
                results);

            // some other random test
            if (this.Prop1 > this.Prop2)
            {
                results.Add(new ValidationResult("Prop1 must be larger than Prop2"));
            }
        }
        return results;
    }
}

Validator.TryValidateProperty() kullanıyorsanız doğrulaması başarısız olursa orada sonuçları koleksiyonuna katacak. Eğer başarısız bir doğrulama daha sonra ise orada hiçbir şey başarı göstergesi olduğu sonucu koleksiyonuna eklemek olacak.

Doğrulama yapıyor:

    public void DoValidation()
    {
        var toValidate = new ValidateMe()
        {
            Enable = true,
            Prop1 = 1,
            Prop2 = 2
        };

        bool validateAllProperties = false;

        var results = new List<ValidationResult>();

        bool isValid = Validator.TryValidateObject(
            toValidate,
            new ValidationContext(toValidate, null, null),
            results,
            validateAllProperties);
    }

Önemli bu yöntemi yanlış validateAllProperties işe koyuldu. validateAllProperties false [Required] niteliği ile sadece özellikleri kontrol edilir. Bu IValidatableObject.Validate() yöntemi koşullu doğrulamalarını ele verir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELPRESADOR

    ELPRESADOR

    21 HAZİRAN 2008
  • KSI

    KSI

    25 Temmuz 2009
  • olinerd

    olinerd

    23 AĞUSTOS 2007