J'utilise xVal dans mon application ASP.NET MVC, ce qui est génial en général. Suite à Steve Sanderson's blog post, j'ai créé un DataAnnotationsValidationRunner pour faire la validation côté serveur des objets attribués. Cela fonctionne très bien pour une classe simple. par exemple. Personne:xVal Comment valider les propriétés enfants de types complexes?
public static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object o)
{
return from prop in TypeDescriptor.GetProperties(o).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(o))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), o);
}
}
public class Person
{
[Required(ErrorMessage="Please enter your first name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your last name")]
public string LastName { get; set; }
}
Cependant, si j'ajoute une propriété d'adresse à cette personne, et marquer la classe d'adresses avec les attributs DataAnnotation, ils ne seront pas validés. par exemple.
public class Person
{
[Required(ErrorMessage="Please enter your first name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your last name")]
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
[Required(ErrorMessage="Please enter a street address")]
public string Street { get; set; }
public string StreetLine2 { get; set; }
[Required(ErrorMessage = "Please enter your city")]
public string City { get; set; }
[Required(ErrorMessage = "Please enter your state")]
public string State { get; set; }
[Required(ErrorMessage = "Please enter your zip code")]
public string Zip { get; set; }
public string Country { get; set; }
}
Un problème est que DataAnnotationValidationRunner ne parcourt pas les propriétés enfants complexes. En outre, si ces erreurs sont ajoutées à une collection d'erreurs, elles doivent toujours être préfixées correctement lorsqu'elles sont ajoutées à l'état du modèle. Par exemple. Les erreurs de personne sont ajoutées comme ceci:
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "person");
}
Je pense que les règles d'exceptions Adresse devraient être préfixé par « Person.Address ». Existe-t-il une manière prise en charge de gérer la validation des objets enfants avec xVal, ou la création d'un objet de transfert de données aplati serait-elle la seule solution?
La deuxième réponse fonctionne mais se décompose si vous avez plusieurs propriétés sur l'objet parent qui associent toutes le même type enfant, mais avec des propriétés différentes. c'est à dire. Utilisateur BillingAddress ShippingAddress Il semble que vous puissiez modifier l'utilitaire de validation xval.jquery pour résoudre ce problème. –