views:

630

answers:

3

I'm trying to validate a class decorated with dataannotation with the Validator class.

It works fine when the attributes are applied to the same class. But when I try to use a metadata class it doesn't work. Is there anything I should do with the Validator so it uses the metadata class? Here's some code..

this works:

public class Persona
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
        public string Nombre { get; set; }

        [Range(0, int.MaxValue, ErrorMessage="La edad no puede ser negativa")]
        public int Edad { get; set; }
}

this doesnt work:

[MetadataType(typeof(Persona_Validation))]
    public class Persona
    {        
        public string Nombre { get; set; }

        public int Edad { get; set; }        

    }

    public class Persona_Validation
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "El nombre es obligatorio")]
        public string Nombre { get; set; }

        [Range(0, int.MaxValue, ErrorMessage = "La edad no puede ser negativa")]
        public int Edad { get; set; }
    }

this is how I validate the instances:

ValidationContext context = new ValidationContext(p, null, null);
            List<ValidationResult> results = new List<ValidationResult>();

            bool valid = Validator.TryValidateObject(p, context, results, true);

thanks.

A: 

Try to move the metadata class into the same namespace as the Persona class if it isn't already. I was having similar problems and moving my metadata class into the same namespace as the L2S model class worked for me.

Dzejms
It didnt work, I've also tried putting the metadata class inside the class, but no luck.
Pablote
A: 

Please see the following link. link text

ashraf
mmm.. I dont like that, there must be a way, ASP.NET MVC works somehow, I guess I could take a look at the code
Pablote
+2  A: 

I found the answer here: http://forums.silverlight.net/forums/p/149264/377212.aspx

MVC recognizes the MetaDataType attribute, but other projects do not. Before validating, you need to manually register the metadata class:

TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Persona), typeof(Persona_Validation)), typeof(Persona));

ValidationContext context = new ValidationContext(p, null, null);
List<ValidationResult> results = new List<ValidationResult>();

bool valid = Validator.TryValidateObject(p, context, results, true);
Jeremy Gruenwald
that was it! :)
Pablote
I expanded on my answer to similar question here: http://stackoverflow.com/questions/1755340/validate-data-using-dataannotations-with-wpf-entity-framework/2467387#2467387
Jeremy Gruenwald