0

je la classe suivante.Net MVC2 Comment ajouter erreur ModelState lors de l'utilisation personnalisée ValidationAttribute

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class DateValidationAttribute : ValidationAttribute 
{ 
    public DateValidationAttribute(string leftDateProperty, CompareOperator compareOperator, string rightDateProperty, string errorMessage) 
      : base(errorMessage) 
    { 
     LeftDateProperty = leftDateProperty; 
     Operator = compareOperator; 
     RightDateProperty = rightDateProperty; 
    } 
    ... 
    ... 
} 
ValidationAttribute

Il prend deux noms de propriété de date et un opérateur dans le constructeur.

Dans la méthode de validation, le résultat de l'instruction LeftDate Operator RightDate est renvoyé.

public override bool IsValid(object value) 
{ 
    DateTime leftDate; 
    DateTime rightDate; 

    // Get all properties on the view model 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 

    DateTime rightDate = (DateTime)properties.Find(RightDateProperty, true).GetValue(value); 
    DateTime leftDate = (DateTime)properties.Find(LeftDateProperty, true).GetValue(value); 

    // Perform rule check 
    switch (Operator) 
    { 
     case CompareOperator.Equal: 
      return leftDate.Equals(rightDate); 
     case CompareOperator.Greater:      
      return leftDate > rightDate; 
     case CompareOperator.Lesser:      
      return leftDate < rightDate; 
     case CompareOperator.GreaterOrEqual:      
      return leftDate >= rightDate; 
     case CompareOperator.LesserOrEqual:      
      return leftDate <= rightDate; 
     default: 
      return false; 
    } 
} 

Parce que c'est un attribut AttriuteTargets.Class Je sais qu'il est impossible pour le cadre de savoir quelle propriété qui est à l'origine de la validation à l'échec. Mais je sais que c'est Left Date Property qui échoue et donc je veux définir l'ID de l'erreur dans le modelstate à cette propriété. La raison en est que je veux que le champ défaillant soit marqué dans le formulaire. Comment puis-je modifier l'élément d'erreur ajouté à la collection d'erreurs dans ModelState afin que son ID corresponde à un champ spécifique dans le formulaire?

Répondre

-1

J'ai trouvé une meilleure façon de le faire en utilisant IDataErrorInfo

Voici comment je le fais. Ce n'est pas générique comme l'exemple de la question. Avec cette solution, vous devez coder chaque vérification. Mais maintenant, la validation fonctionnera bien jusqu'à la javascript et la mise en évidence de l'élément d'entrée défaillant.

public class TestModel: IDataErrorInfo 
{ 

    public TestModel() 
    { 
    } 

    [Required] 
    public string StartDate { get; set; } 

    [Required] 
    public string EndDate { get; set; } 

    #region IDataErrorInfo Members 

    public string Error 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      switch (columnName) 
      { 
       case "StartDate": 
        { 
         if (StartDate < DateTime.Today) 
         { 
          return "Start date must not be a date in the past"; 
         } 
         break; 
        } 
       case "EndDate": 
        { 
         if (EndDate < StartDate) 
         { 
          return "End date must not be a date before start date"; 
         } 
         break; 
        } 
       default: 
        return string.Empty; 
      } 
      return string.Empty; 
     } 
    } 
}