Question

I'm using a base contact model which other custom contact models classes inherit.

public class BaseContactModel
{
    [Required(ErrorMessage = "Firstname is required")]
    public virtual string FirstName { get; set; }
}

The base contact model uses validation attributes to flag a property is required but in some cases I want to override or stop that. Is this going to be possible?

public class ContactModel : BaseContactModel
{
    [NotRequired]
    public override string FirstName { get; set; }
}

I attempted to use a new validation attribute NotRequired to just return true, but appears the attributes are just being stacked up so Required & NotRequired are running and the validation is failing.

On looking for solutions (which I couldn't find) I found that some unrelated attributes have an 'inherited' property, but I don't see this in the native validation attributes in System.ComponentModel.DataAnnotations.

Is this a lost cause? Do I need to roll my own versions which would support disabling inheritance? Any help greatly appreciated.

Était-ce utile?

La solution

See this below, I've created one class Model that inherits from another BaseModel, used the new keyword then validated one of each instance. From what I can see, they both use the base attributes.

I've added a control class ControlModel for clarity on the validation routine.

class Program
{
    static void Main(string[] args)
    {
        ValidationTest<Model>();
        ValidationTest<BaseModel>();
        ValidationTest<ControlModel>();

        Console.Read();
    }

    private static void WriteAttributeInfo<T>()
    {
        Console.WriteLine(string.Concat(typeof(T), " attributes:"));
        typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList();
    }

    private static void ValidationTest<T>()
    {
        object obj = Activator.CreateInstance<T>();
        Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>())));
    }
}

class ControlModel
{
    public string FirstName { get; set; }

    public string Email { get; set; }
}

class BaseModel
{
    [RequiredAttribute]
    public virtual string FirstName { get; set; }

    [RequiredAttribute]
    public virtual string Email { get; set; }
}

class Model : BaseModel
{
    public new string FirstName { get; set; }

    public new string Email { get; set; }
}

ConsoleApplication1.Model test: isValid = False

ConsoleApplication1.BaseModel test: isValid = False

ConsoleApplication1.ControlModel test: isValid = True

From this example, it appears you can't override/hide/ignore inherited required validation (haven't tried others yet) attributes.

Autres conseils

This may be the case where you actually want a new property

 public class ContactModel : BaseContactModel 
{
        [NotRequired]
        public new string FirstName { get; set; } 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top