سؤال

أتساءل عما إذا كان أي شخص يعرف ما إذا كان XVAL سيعمل كما هو متوقع إذا قمت بتحديد سمات SystemBons.componentModel.Dataannotations على الواجهات التي يتم تنفيذها بواسطة فئات النموذج الخاصة بي، بدلا من فئات النماذج المخرجة مباشرة.

public interface IFoo
{
    [Required] [StringLength(30)]
    string Name { get; set; }
}

ثم في فئة نموذجي لن يكون هناك أي سمات التحقق من الصحة ...

public class FooFoo : IFoo
{
    public string Name { get; set; }
}

إذا حاولت التحقق من صحة Foofoo مع XVAL، فهل سيتم استخدام AttesIbs من واجهةها؟

هل كانت مفيدة؟

المحلول

في الوقت الحالي xVal.RuleProviders.DataAnnotationsRuleProvider ينظر فقط إلى الممتلكات المحددة على الطبقة النموذجية نفسها. يمكنك أن ترى هذا في الطريقة GetRulesFromProperty في فئة قاعدة مقدم القاعدة PropertyAttributeRuleProviderBase:

protected virtual IEnumerable<Rule> GetRulesFromProperty(
    PropertyDescriptor propertyDescriptor)
{
    return from att in propertyDescriptor.Attributes.OfType<TAttribute>()
           from validationRule in MakeValidationRulesFromAttribute(att)
           where validationRule != null
           select validationRule;
}

ال propertyDescriptor المعلمة تمثل خاصية في فئة النموذج الخاصة بك و Attributes الممتلكات تمثل فقط السمات المحددة مباشرة على الممتلكات نفسها.

ومع ذلك، يمكنك التمديد بالطبع DataAnnotationsRuleProvider وتجاوز الأسلوب المناسب لجعله يفعل ما تريد: استخراج سمات التحقق من الصحة من الواجهات المنفذة. يمكنك بعد ذلك تسجيل مزود القاعدة الخاص بك مع XVAL:

ActiveRuleProviders.Providers.Clear();
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider());
ActiveRuleProviders.Providers.Add(new CustomRulesProvider());

للحصول على سمات من الخصائص في الواجهات المنفذة، يجب أن تمتد DataAnnotationsRuleProvider وتجاوز GetRulesFromTypeCore. وبعد يحصل على معلمة من النوع System.Type هذا له طريقة GetInterfaces.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top