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;&#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;&#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />
J'ai toujours le même problème.
UPDATE 9 juillet 2012 - On dirait que cela est corrigé dans RTM.
^
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)Voir la source montre ce qui suit:
data-val-regex-pattern="([a-zA-Z0-9 .&'-]+)" <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 4/Beta
On dirait que nous sommes en double encodage.
Essayez d'échapper à ces personnages:
[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
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; }
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("&","&");
tagBuilder.MergeAttributes(attrs);
Nous ne nous sommes souciés que de & ampères, c'est pourquoi ce remplacement littéral
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é.
Essayez d’utiliser le code ASCII pour ces valeurs:
^([a-zA-Z0-9 .\x26\x27-]+)$
\x26
= &
\x27
= '
Le format est \xnn
où 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.
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; }
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 { }))