2009-07-16 8 views
0

Je rencontre des problèmes lors de l'ajout de méthodes de validation à quelques commandes de mon application MVC. J'utilise ce qui suit pour tester le format mm/jj/aaaa:Problèmes de validation de l'état du modèle asp.NET MVC

if (!Regex.IsMatch(candidateToEdit.availability.StartDate.ToShortDateString(), @"giantregex")) 
      ModelState.AddModelError("availability_StartDate", "Start date must be in the mm/dd/yyyy format."); 
//giantregex is a giant regular expression omitted for clarity 

À mon avis, j'ai:

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 

<%= Html.ValidationMessage("availability_StartDate", "*")%> 

Pour une raison quelconque le texte d'erreur n'est pas affiché, il reconnaît qu'il est une erreur et le début de la liste est généré, mais la "Date de début doit être au format mm/jj/aaaa". n'est pas affiché. Il valide si vous mettez correctement la date.

+0

Votre validation se produit-elle dans une vue partielle (alias UserControl)? J'ai eu ce problème mais seulement pour la validation des entrées dans les vues partielles. – cfeduke

+0

Non, c'est une vue normale. –

+0

Et si l'utilisateur entre une date comme 2/31/2009? Vous ne pouvez pas valider une date avec une regex. – Paco

Répondre

3

Je pense que le problème ici est que vous testez un type DateTime réel par rapport à une expression régulière. Parce qu'ils ont entré un format d'heure de date non valide dans la zone de texte, il n'est jamais réellement analysé dans un DateTime réel où ToShortDateString() peut être appelé sur il. Par conséquent, votre validation d'expression régulière ne se produit jamais réellement. Vous devrez adopter le modèle ViewModel où vous exposerez d'abord tous les problèmes potentiels d'analyse en tant que chaînes (comme "candidateToEditViewModel.AvailabilityStartDateString") ou implémenterez la validation côté client et le programme de façon défensive.

+0

Cela a du sens, il semble que lorsque la date invalide est affichée, elle est initialisée à une valeur par défaut, et si c'est le cas, l'expression régulière devrait retourner vrai, ce qui n'est pas le cas. –

+0

Je pense que ce que vous voyez est la validation intégrée parce que vous avez déclaré (je suppose) un DateTime et non un DateTime? donc la propriété est réellement * requise *. – cfeduke

+0

Donc, j'ai été capable de tricher un peu en fonction de la logique dont j'ai besoin. Chaque fois qu'une date invalide est publiée un nouveau DateTime est juste initialisé, donc je vérifie juste pour voir si la valeur StartDate est égale à la valeur initialisée de DateTime et jette l'erreur si elle est vraie. Marqué comme la réponse, car il m'a conduit directement à la solution. Merci. –

0

Je pense que vous devez inclure un résumé de validation pour obtenir le message

<%= Html.ValidationSummary() %> 

EDIT: "" Essayez de mettre un au lieu d'un "_" comme nom de la propriété dans l'appel AddModelError, comme ceci:

Au lieu de:

ModelState.AddModelError("availability_StartDate", "Start date must be..."); 

essayez ceci:

ModelState.AddModelError("availability.StartDate", "Start date must be..."); 
+0

Le <% = Html.ValidationSummary()%> est présent. Je vais modifier mon message original pour clarifier cela. –

+0

Changement d'un _ à un. ne semble pas faire la différence, c'est étrange. Cela fonctionne très bien avec tous les autres messages. –

+0

Yeah breakpointing dans mon code montre. utilisé pour les clés d'erreur du modèle au lieu de _ (bien que j'utilise xVal mais je suis assez sûr que l'opération reste la même). – cfeduke

0

L'échantillon vous a donné des œuvres à mon TestProject . Pouvez-vous essayer de reproduire l'erreur dans un projet fraîchement créé?

Questions connexes