51 votes

Validation des DataAnnotations (Expression régulière) dans asp.net mvc 4 - razor view

Le validateur DataAnnotations ne fonctionne pas dans asp.net mvc 4 razor view, lors de l'utilisation des caractères spéciaux dans l'expression régulière.

Modèle :

[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
public string FirstName { get; set; }

Razor View :

@Html.TextBoxFor(model => Model.FirstName, new { })
@Html.ValidationMessageFor(model => Model.FirstName)

La validation discrète est rendue dans la vue comme :

<input type="text" value="" tabindex="1" style="height:auto;" name="FirstName" maxlength="100" id="FirstName" data-val-regex-pattern="^([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)$" data-val-regex="Invalid First Name" data-val-length-max="100" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val="true" class="textfield ui-input-text ui-body-d ui-corner-all ui-shadow-inset valid">

Le modèle regex dans le html ci-dessus n'est pas rendu comme spécifié dans l'expression régulière du modèle, ce qui entraîne une erreur même en entrant les données valides ( Sam's ).

Comment puis-je gérer cela ?

--UPDATE--

J'ai mis à jour le code selon la suggestion de @Rick.

[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")]
public string FirstName { get; set; }

View Source montre ce qui suit :

<input data-val="true" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val-length-max="100" data-val-regex="Enter only alphabets and numbers of First Name" data-val-regex-pattern="([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />

J'ai toujours le même problème.

0 votes

Nous venons d'avoir un problème similaire où nous voulons qu'un "&nbsp ;" soit craché dans le ErrorMessage

0 votes

Bonjour, je suis un collègue de TweeZz ;] Oui, nous l'avons corrigé à la fin, mais c'était un correctif plutôt rudimentaire. Lors de la production d'attributs de validation discrets, nous avons décodé en html tous les messages de validation pour les validateurs regex, vous pourriez faire de même dans votre cas.

0 votes

J'ai confirmé une différence entre la mise à jour des outils MVC 3 et MVC 4 Beta. J'ai ouvert un bug et nous enquêtons.

36voto

RickAnd - MSFT Points 3741

MISE À JOUR 9 juillet 2012 - Il semble que ce problème soit corrigé dans la version RTM.

  1. Nous sous-entendons déjà ^ y $ donc vous n'avez pas besoin de les ajouter. (Il ne semble pas y avoir de problème à les inclure, mais vous n'en avez pas besoin)
  2. Il semble s'agir d'un bogue dans ASP.NET MVC 4/Preview/Beta. J'ai ouvert un bug

La source d'affichage montre ce qui suit :

data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)"                  <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9&#32;.&amp;amp;&amp;#39;-]+)"      <-- MVC 4/Beta

On dirait qu'il y a un double encodage.

0 votes

Rick, est-ce que ça se répare après avoir supprimé ^ et $ ? Je suis toujours confronté au même problème même après les avoir supprimés. J'ai mis à jour ma question avec cette mise en œuvre.

0 votes

Non, ça ne change rien. Pouvez-vous marquer cette réponse comme étant la bonne ?

2 votes

Rick, je ne suis pas sûr de la marquer comme une réponse tant qu'elle ne résout pas ce problème :)

13voto

Darin Dimitrov Points 528142

Essayez d'échapper à ces caractères :

[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]

0 votes

Toujours le même résultat : <input type="text" value="" tabindex="1" style="height:auto ;" name="FirstName" maxlength="100" id="FirstName" data-val-regex-pattern="^([a-zA-Z0-9 \.\ &\'\-]+)$" data-val-regex="Prénom non valide" data-val-length-max="100" data-val-length="Le champ Prénom doit être une chaîne de caractères d'une longueur maximale de 100." data-val="true" class="textfield ui-input-text ui-body-d ui-corner-all ui-shadow-inset input-validation-error">

0 votes

Et si tu mettais le double \\ dans l'expression rationnelle ?

0 votes

Soit double \\ ou @ devant l'ouverture " comme Darin l'a fait dans son exemple.

5voto

Bahtiyar Özdere Points 328

Essayez le signe @ au début de l'expression. Ainsi, vous n'avez pas besoin de taper les caractères d'échappement, il suffit de copier-coller l'expression régulière dans "" et de mettre le signe @. Par exemple :

[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }

1voto

Dismissile Points 12054

Quel navigateur utilisez-vous ? J'ai saisi votre exemple et l'ai essayé dans IE8 et Chrome et il a été validé correctement lorsque j'ai saisi la valeur. Sam's

 public class IndexViewModel
 {
    [Required(ErrorMessage="Required")]
    [RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
    public string Name { get; set; }
 }

Lorsque j'inspecte le DOM à l'aide de la barre d'outils IE Developer et du mode Chrome Developer, aucun caractère spécial n'apparaît.

0 votes

J'ai essayé dans Firefox, IE et chrome. Mon application est développée en utilisant asp.net mvc 4(C#). asp.net/mvc/mvc4

0 votes

Si vous excluez le discret jquery script, votre validation fonctionne-t-elle correctement ?

0 votes

Lorsque j'exclue "jquery.validate.unobtrusive.min.js", la validation côté client ne fonctionne pas.

1voto

petho Points 446

Nous avons eu un problème similaire dans le passé (comme mentionné par TweeZz). Dans notre cas, nous contrôlons la sortie de TextBoxFor par notre méthode d'extension htmlHelper personnalisée qui construit MvcHtmlString, là, en une seule étape, nous devons ajouter ces attributs de validation discrets, ce qui est fait par l'intermédiaire de

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

après l'appel à cette méthode, les attributs sont encodés en html, donc nous vérifions simplement s'il y avait un validateur d'expression régulière et si c'est le cas, nous désencodons en html cet attribut et ensuite nous les fusionnons dans tagBuilder (pour construire la balise "input")

if(attrs.ContainsKey("data-val-regex"))
    attrs["data-val-regex"] = ((string)attrs["data-val-regex"]).Replace("&amp;","&");
tagBuilder.MergeAttributes(attrs);

On ne s'intéresse qu'aux amplis, c'est pourquoi ce remplacement littéral

1 votes

En général, nous avions besoin de plus de contrôle sur le rendu de certains attributs ( stackoverflow.com/questions/6016500/ ), nous avons donc décidé de copier-coller (et de modifier) le code source MVC pour certaines méthodes d'aide. Il ne semble pas y avoir d'autre moyen

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X