2011-11-30 5 views
0

I a créé une simple validation personnalisée pour prendre le temps que entrée est dans un format de 12 heures et l'entrée de texte a un '99: jeu de masque 99' , donc je vais obtenir:ASP.NET MVC personnalisée validation

12 : 00

la validation fonctionne très bien sur le serveur:

 private ValidationResult ValidateTwelveHourFormat(string time, ValidationContext validationContext) 
    { 
     if (String.IsNullOrWhiteSpace(time.Substring(0, 1)) 
      || Convert.ToInt32(time.Substring(0, 1)) > 1 
      || Convert.ToInt32(time.Substring(1, 1)) > 2 
      || Convert.ToInt32(time.Substring(3, 1)) > 5) 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
     return ValidationResult.Success; 
    } 

Cependant, la même validation sur le client ne se comporte pas comme j'attendre:

$.validator.unobtrusive.adapters.addSingleVal('timeformat', 'format'); 
$.validator.addMethod('timeformat', function (value, element, timeformat) { 
if (value) { 
    if (timeformat == "TwelveHour") { 
     if (value.toString().substring(0, 1) == "" 
       || value.toString().substring(0, 1) > 1 
       || value.toString().substring(1, 1) > 2 
       || value.toString().substring(3, 1) > 5) { 
      return false; 
     } 
    } 
} 
return true; 
}); 

Le client validera correctement le premier chiffre seulement. Donc, si je suis entré dans un 3, il se déclencherait bien, mais pas pour d'autres positions dans la chaîne. J'ai jeté quelques alertes là-dedans et il semble déclencher la méthode quand j'entre un caractère dans le texte. Ce comportement m'embrouille parce que je ne pensais pas que cela se déclencherait avant que le formulaire ait été soumis, seulement après. Dans le cas contraire, l'utilisateur verrait des messages d'erreur lors de leur entrée dans le formulaire la première fois et je ne crois pas que les jives avec la validation de manière fonctionne généralement.

1.) Pourquoi le côté client ne valide-t-il pas correctement les autres positions de caractères?
2.) Pourquoi le client valide-t-il quand le formulaire n'a pas encore été soumis?

Mise à jour

1.) Je le substr de JavaScript() utilisé comme il agit comme C# 's String.substring().

Pour la question 2 - J'utilise des annotations de données avec le framework mvc. Disons que j'ai un champ défini pour être requis. Lorsque j'entre ce formulaire pour la première fois, ce champ ne déclenche pas de validation sur le flou. Je peux entrer dans la merde, enlever la merde, mais pas déclencher la validation. Voilà pourquoi je suis confus. Il semble différer du comportement par défaut. Je pense que la validation serait déclenchée après une tentative de soumission est tentée comme l'exemple que j'ai mentionné.

Répondre

1

Question 1:

Javascript String.substring() fonctionne différemment C#. Le deuxième paramètre n'est pas la longueur, mais l'index de fin. http://www.w3schools.com/jsref/jsref_substring.asp

Question 2:

Il valide généralement onBlur aussi, dans mon expérience.

+0

javascript a 'substr' si – Esailija

+0

@Esailija son code utilise 'String.substring() ', donc je suis juste en train d'expliquer pourquoi ça ne marche pas comme il s'y attend. Consultez le lien. –

+0

Eh bien, je voulais juste le mettre là-bas que vous pourriez le suggérer au lieu d'essayer de comprendre ce que l'index de fin doit être dans 'substring' – Esailija

0

1.) Ma première réponse était fausse; Je dois regarder à nouveau.

2.) Valider les vérifications sur le keyup et sur le flou; vous pouvez définir à la fois de ceux que params dans les options objet

onkeyup: false, 
onblur: false 
0

Pourquoi ne pas simplement utiliser un validateur Expression régulière, puis laissez-vous soucier du code côté client. Vous pouvez utiliser quelque chose comme ceci:

<asp:RegularExpressionValidator ID="revTime" ControlToValidate="txtTime" ValidationExpression="[0]{0,1}[1-9]:[0-5][0-9]|[1][0-2]:[0-5][0-9]" ValidationGroup="x" runat="server" ErrorMessage="Not a valid time." /> 

et si vous utilisez le AjaxControlToolkit, vous pouvez filtrer l'édition en utilisant leur FitleredTextBoxExtender comme suit:

<ajaxToolkit:FilteredTextBoxExtender ID="fteTime" runat="server" TargetControlID="txtTime" FilterMode="ValidChars" FilterType="Numbers, Custom" ValidChars=":" /> 
+2

Ceci est MVC; ces contrôles ne s'appliquent pas –