2010-07-13 6 views
1

J'ai lu this avant mvc à propos asp.net de validation, mais ne mentionne pas ce que je veux faire, donc ce modèle de vue -Comment ajouter une logique personnalisée pour la validation à l'aide des annotations de données asp.net mvc?

public class MyViewModel 
{ 
     [StringLength(200, MinimumLength = 2, ErrorMessage = "Invalid Name")] 
     public string Name { get; set; } 
     [Required(ErrorMessage = "*")] 
     public DateTime StartDate { get; set; } 
     [Required(ErrorMessage = "*")] 
     public DateTime EndDate { get; set; } 

} 

J'ai installé la validation et works..but maintenant je veux pour ajouter une condition comme StartDate doit toujours être supérieure à la date de fin ... comment puis-je ajouter une telle logique/validation personnalisée? Au lieu de le vérifier explicitement sur le contrôleur et de le rediriger ... est-ce que asp.net mvc validation peut accommoder quelque chose comme ça?

Répondre

1

C'est ce que je fini par faire je vérifie également si la date choisie ne today..in cas où quelqu'un veut faire quelque chose de similaire -

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
    public sealed class EndDateValidationAttribute : ValidationAttribute 
    { 
     private const string _defaultErrorMessage = "End date cannot be prior to start date"; 

     public EndDateValidationAttribute(string startDate, string endDate) 
      : base(_defaultErrorMessage) 
     { 
      StartDateStr = startDate; 
      EndDateStr = endDate; 
      ErrorMessage = _defaultErrorMessage; 
     } 

     public string StartDateStr { get; private set; } 
     public string EndDateStr { get; private set; } 

     public DateTime StartDate { get; private set; } 
     public DateTime EndDate { get; private set; } 

     public override bool IsValid(object value) 
     { 
      // This is not a required field validator, so if the value equals null return true. 
      if (value == null) return true; 

      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
      object startDate = properties.Find(StartDateStr, true /* ignoreCase */).GetValue(value); 
      object endDate = properties.Find(EndDateStr, true /* ignoreCase */).GetValue(value); 

      StartDate = (DateTime)startDate; 
      EndDate = (DateTime)endDate; 

      if (StartDate > EndDate) return false; 
      else if (Convert.ToDateTime(startDate) == DateTime.Today.Date) 
      { 
       return false; 

      } 
      return true; 
     } 
    } 

Voici comment vous pouvez l'utiliser -

[EndDateValidationAttribute("StartDate", "EndDate", ErrorMessage = "Start date should be after today's date and before end date!")] 
    public class CustomeDate 
    { 
     [DisplayName("StartDate")] 
     [Required(ErrorMessage = "*")] 
     public DateTime StartDate { get; set; } 
     [DisplayName("EndDate")] 
     [Required(ErrorMessage = "*")] 
     public DateTime EndDate { get; set; } 
    } 
1

Je ne suis pas sûr à ce sujet, mais il peut être utile de regarder le contrôleur de compte par défaut asp.net MVC et le PropertiesMustMatchAttribute pour un exemple de validation personnalisée.

Ayant regardé le code brièvement, cela devrait être faisable.

Questions connexes