2010-03-15 5 views
6

Je commence juste avec ASP.NET MVC 2 et je joue avec Validation.Comment valider deux propriétés avec ASP.NET MVC 2

Disons que j'ai 2 propriétés:

  • PassWord1
  • password2

Et je veux exiger qu'ils soient tous deux remplis, et exigent que les deux sont les mêmes avant que le modèle est valable. J'ai une classe simple appelée "NewUser".

Comment pourrais-je l'implémenter? J'ai lu à propos de ValidationAttribute et je comprends cela. Mais je ne vois pas comment j'utiliserais cela pour implémenter une validation qui compare deux ou plusieurs propriétés par rapport à eathother.

Merci d'avance!

problème ci-dessous solution:

Lorsque cela est appliqué à une application et la ModelBinder exécute la validation du modèle, alors il est un problème:

Si un Au niveau de la propriété ValidationAttribute contient une erreur, puis les ValidationAttribute de classe sont NOT validé. Je n'ai pas encore trouvé de solution à ce problème.

Si vous avez une solution à ce problème, partagez votre expérience. Merci beaucoup!

Répondre

7

Le modèle ASP.NET MVC 2 par défaut de Visual Studio inclut l'attribut de validation exact dont vous avez besoin. Collé à partir AccountModels.cs fichier:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)] 
public sealed class PropertiesMustMatchAttribute : ValidationAttribute { 
    private const string _defaultErrorMessage = 
     "'{0}' and '{1}' do not match."; 
    private readonly object _typeId = new object(); 

    public PropertiesMustMatchAttribute(string originalProperty, 
     string confirmProperty) 
     : base(_defaultErrorMessage) { 
     OriginalProperty = originalProperty; 
     ConfirmProperty = confirmProperty; 
    } 

    public string ConfirmProperty { get; private set; } 
    public string OriginalProperty { get; private set; } 

    public override object TypeId { 
     get { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      OriginalProperty, ConfirmProperty); 
    } 

    public override bool IsValid(object value) { 
     PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, 
      true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, 
      true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
    } 
} 

Comment utiliser:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")] 
class NewUser { 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 
    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 
} 
+1

Le seul problème que je peux voir avec ceci est, lorsque deux propriétés du modèle (classe dans ce cas), ne sont pas égaux, il ne désigne pas les propriétés spécifiques comme contenant des erreurs, comme il le fait pour [Obligatoire] et <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, je vois. Bien que je ne sois pas sûr s'il y a une solution élégante pour le faire fonctionner dans l'autre sens, en utilisant la liaison de modèle. Après tout, il s'agit techniquement d'une validation au niveau de la classe. Si vous ** devez ** ajouter les erreurs aux propriétés à la place, alors peut-être vérifier les deux valeurs dans le contrôleur après la liaison serait la solution la plus rapide (mais pas le plus élégant). –

+0

Dans la version MVC 2, la méthode d'assistance Html.ValidationSummary peut désormais afficher les erreurs au niveau du modèle uniquement. – murki