web-dev-qa-db-fra.com

Validation des données (expressions régulières) dans asp.net mvc 4 - vue rasoir

Le validateur DataAnnotations ne fonctionne pas dans la vue rasoir asp.net mvc 4, 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 en vue sous la forme:

<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 d'expression régulière dans le code 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 lors de la saisie des données valides (Sam's).

Comment puis-je gérer cela?

--METTRE À JOUR--

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 affiche les éléments suivants:

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

UPDATE 9 juillet 2012 - On dirait que cela est corrigé dans RTM. 

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

Voir la source 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 que nous sommes en double encodage.

34
RickAndMSFT

Essayez d'échapper à ces personnages:

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

Essayez le signe @ en début d’expression. Donc, vous n'aurez pas besoin de taper des caractères d'échappement, il vous suffit de copier, coller l'expression régulière dans "" et mettre le signe @ Ainsi:

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

Nous avons eu des problèmes similaires dans le passé (comme mentionné par TweeZz) . Dans notre cas, nous contrôlons la sortie de TextBoxFor à l'aide de notre méthode d'extension htmlHelper personnalisée qui construit MvcHtmlString, il nous faut en une étape ajouter ces éléments de manière transparente attributs de validation, ce qui se fait via

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

après l'appel de cette méthode, les attributs sont codés en HTML. Nous vérifions donc simplement s'il y avait un validateur d'expression régulière et si oui, nous supprimons le code de cet attribut, puis 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);

Nous ne nous sommes souciés que de & ampères, c'est pourquoi ce remplacement littéral

1
petho

Quel navigateur utilisez-vous? J'ai entré votre exemple et essayé à la fois dans IE8 et Chrome et tout s'est bien passé 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'est affiché.

1
Dismissile

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 de caractère hexadécimal à deux chiffres. Vous pouvez également utiliser \unnnn pour spécifier un code de caractère hexadécimal à quatre chiffres pour le caractère Unicode.

0
Ahmad Mageed

Essayez celui-ci en classe de 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
prashant shivhare

Le problème est que le modèle de regex est codé en HTML deux fois , une fois lors de la génération de la regex et une fois lors du rendu dans votre vue.

Pour le moment, essayez d’emballer votre TextBoxFor dans un Html.Raw, comme ceci:

@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))
0
counsellorben