Validation des annotations de données (Expression régulière) dans asp.net mvc 4-razor view

le validateur des annotations de données ne fonctionne pas dans asp.net mvc 4 razor view, en utilisant les 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; }

Rasoir Vue:

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

la validation discrète est rendue en 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 motif regex dans le html ci-dessus n'est pas rendu tel que spécifié dans la RegularExpression du Model, ce qui entraîne une erreur même lors de l'entrée du de données (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; }

Afficher la Source est le suivant:

<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.

44
demandé sur Prasad 2011-11-23 19:17:42

8 réponses

mise à jour du 9 juillet 2012 - On dirait que C'est corrigé dans RTM.

  1. nous impliquons déjà ^ et $ si vous n'avez pas besoin de les ajouter. (Il ne semble pas être un problème pour les inclure, mais vous n'en avez pas besoin)
  2. cela semble être un bug dans ASP.NET MVC 4 / Preview / Beta. J'ai ouvert un bug

Afficher la source est le suivant:

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'on a un double encodage.

34
répondu RickAndMSFT 2017-04-21 13:13:27

Essayez d'échapper à ces personnages:

[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
10
répondu Darin Dimitrov 2011-11-23 15:22:37

@ signer au début de l'expression. Donc, vous n'aurez pas besoin de taper escape characters juste copier coller l'expression régulière dans "" et mettre @ sign. Comme ceci:

[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }
5
répondu Bahtiyar Özdere 2012-09-07 15:39:30

Quel navigateur utilisez-vous? J'ai entré votre exemple et j'ai essayé à la fois IE8 et Chrome et il a validé fine quand j'ai tapé 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 en utilisant la barre D'outils du développeur IE et le mode développeur Chrome, il n'affiche pas de caractères spéciaux.

1
répondu Dismissile 2011-11-23 16:13:20

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

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

après appel à cette méthode, les attributs sont codés html, donc nous vérifions simplement s'il y avait un validateur D'expression régulier et si c'est le cas, nous html unconode cet attribut et puis les fusionner 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);

Nous ne se souciait & amplis, c'est pourquoi ce littérale de remplacement

1
répondu petho 2012-01-05 14:27:40

essayez d'utiliser le code ASCII pour ces valeurs:

^([a-zA-Z0-9 .\x26\x27-]+)$
  • \x26= &
  • \x27= '

le format est \xnn nn est le code à deux chiffres du caractère hexadécimal. Vous pouvez également utiliser \unnnn pour spécifier un code de quatre caractères hexadécimaux pour le caractère Unicode.

0
répondu Ahmad Mageed 2011-11-23 15:50:09

le problème est que le motif regex est encodé HTML deux fois, une fois lorsque le regex est construit, et une fois lorsqu'il est rendu dans votre vue.

pour l'instant, essayez d'envelopper votre TextBoxFor dans un Html.Raw, comme ceci:

@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))
0
répondu counsellorben 2011-11-23 23:03:14

essayez celui - ci dans la classe du modèle

    [Required(ErrorMessage = "Enter full name.")]
    [RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]

    public string FullName { get; set; }
0
répondu prashant shivhare 2017-12-18 07:18:10