2012-10-08 63 views
5

Estoy usando un modelo de contacto base que otras clases de modelos de contactos personalizados heredan.Prevenir la herencia de atributos de validación en el modelo

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

El modelo de contacto de la base utiliza los atributos de validación a la bandera se requiere una propiedad, pero en algunos casos que desea anular o detener eso. ¿Esto va a ser posible?

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

me trató de utilizar un nuevo atributo de validación NotRequired para volver simplemente cierto, pero parece los atributos solo se están apilados de manera obligatoria & NotRequired se están ejecutando y la validación está fallando.

en la búsqueda de soluciones (que no pude encontrar) me encontré con que algunos atributos no relacionados tienen una propiedad 'heredada', pero yo no veo esto en la validación nativa atributos en System.ComponentModel.DataAnnotations.

¿Es esto una causa perdida? ¿Debo instalar mis propias versiones que admitan la desactivación de la herencia? Cualquier ayuda muy apreciada.

Respuesta

2

Ver este continuación, he creado una clase que hereda de Model otra BaseModel, utiliza la nueva palabra clave validados uno de cada instancia . Por lo que puedo ver, ambos usan los atributos básicos.

He añadido una clase de control ControlModel para mayor claridad en la rutina de validación.

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; } 
} 

prueba ConsoleApplication1.Model: isValid = False

prueba

ConsoleApplication1.BaseModel: isValid = False

prueba ConsoleApplication1.ControlModel: isValid = True

De este ejemplo, parece que no puede anular/ocultar/ignorar validatio requerido heredado n (no he probado otros todavía) atributos.

+0

) Odio responder y aceptar mis propias preguntas, pero según la prueba anterior, parece que la pregunta original no puede ser hecho –

+0

¿Realmente no hay solución para esto? – Giorgio

0

Este puede ser el caso en el que realmente quiere una nueva propiedad

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

¿Esto reemplaza los atributos? Intenté usar nuevo (con una propiedad virtual) pero parece que todavía está llegando a la validación. –

+0

He usado esta estrategia algunas veces en el pasado. Debe ser una propiedad completamente nueva, por lo tanto, solo se debe activar un atributo de validación u otro. Por supuesto, depende de cómo declare o use su variable de modelo para determinar qué propiedad se usa realmente. Si no funciona, es posible que desee publicar algún código de controlador para ver si podemos averiguar por qué. – dumdum

+0

Gracias por su respuesta, tendré otro esfuerzo esta tarde y posiblemente incluso pueda probar un sitio directamente. –

Cuestiones relacionadas