J'essaie d'utiliser DataAnnotations ajouter la validation à mes modèles dans asp.NET MVC 2 RC2, en utilisant TryUpdateModelasp.NET MVC 2 DataAnnotations UpdateModel <T> validation
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
Cela met à jour le modèle, mais la validation n'est jamais appelé. J'ai également essayé TryUpdateModel (qui est le type direct d'utilisateur), n'utilisant pas le fournisseur de valeur de formulaire, en utilisant directement ProvisioningObject (qui a les métadonnées de validation), en vain.
recherche sur Google pour des exemples me donne des moyens d'utiliser DataAnnotations en se liant par un paramètre
public ActionResult Update(User user)
Ce que je n'aime pas pour les scénarios de mise à jour.
Des conseils et/ou des solutions?
EDIT Mes objets sont des objets générés automatiquement à partir d'un service WCF.
je fait pour être en mesure partials ajouter DataAnnotations. J'appelle TryUpdateModel trois fois car il ne prend apparemment pas en charge l'héritage, ce qui est également mon problème avec DataAnnotations. Je spécifie les attributs de validation pour ProvisioningObject, et la liaison ne cherche pas les choses héritées comme ça.
[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}
[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}
public class ProvisioningObjectMetadata
{
[DisplayName("Country")]
public string CountryIsoCode { get; set; }
[Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
[TempValidator]
public string DisplayName { get; set; }
}
public class UserMetadata
{
[DisplayName("Username")]
public string Name { get; set; }
}
// Controller action
public ActionResult Update(string id, FormCollection form)
{
var user = UserManager.Find(id);
this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());
if (ModelState.IsValid) // always true
{
return Redirect;
}
else
{
return View();
}
}
Si j'ajoute les métadonnées DisplayName dans UserMetadata, il fonctionne comme prévu, mais cela semble très redondant pour rien. Et cela signifierait que je devrais également copier/coller toutes mes interfaces héritées afin que TryUpdateModel se comporte de manière appropriée.
Je suppose que je suis à la recherche d'une manière qui ne me demande pas de copier-coller mes attributs de validation des classes héritées.
Je viens d'essayer de le faire UpdateModel (puisque je ne peux pas mettre MetadataType sur une interface) et il ne change rien. J'ai créé un validateur temporaire et il ne semble jamais avoir touché la méthode IsValid. Pour le scénario Mise à jour, je ne suis pas sûr de vous suivre. Si vous avez de bons liens vers des blogs ou des exemples, ce serait suffisant pour me lancer. Merci pour votre contribution! –
Pouvez-vous poster plus de code s'il vous plaît? Je ne suis pas clair sur ce que vous essayez de faire plus. – jfar
New Answer comment: Les attributs sont côté client. J'utilise des classes partielles pour ajouter les attributs appropriés aux objets générés automatiquement. –