Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent inheriting validation attributes in model

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.

like image 577
Phil Cooper Avatar asked Oct 08 '12 19:10

Phil Cooper


People also ask

What is ModelState IsValid in MVC?

ModelState. IsValid indicates if it was possible to bind the incoming values from the request to the model correctly and whether any explicitly specified validation rules were broken during the model binding process. In your example, the model that is being bound is of class type Encaissement .

How does ValidationMessageFor work in MVC?

ASP.NET MVC: ValidationMessageFor The Html. ValidationMessageFor() is a strongly typed extension method. It displays a validation message if an error exists for the specified field in the ModelStateDictionary object. Visit MSDN to know all the overloads of ValidationMessageFor() method.

Which of the following are alternatives to perform model validation instead of using built in validation attributes?

Alternatives to built-in attributes If you need validation not provided by built-in attributes, you can: Create custom attributes. Implement IValidatableObject.

What is the use of ModelState in MVC?

The ModelState has two purposes: to store and submit POSTed name-value pairs, and to store the validation errors associated with each value.


1 Answers

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.

like image 51
Phil Cooper Avatar answered Nov 15 '22 06:11

Phil Cooper