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;&#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;&#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />
j'ai Toujours le même problème.
8 réponses
mise à jour du 9 juillet 2012 - On dirait que C'est corrigé dans RTM.
- 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) - 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 .&'-]+)" <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 4/Beta
on dirait qu'on a un double encodage.
Essayez d'échapper à ces personnages:
[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
@ 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; }
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.
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("&","&");
tagBuilder.MergeAttributes(attrs);
Nous ne se souciait & amplis, c'est pourquoi ce littérale de remplacement
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 à 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.
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 { }))
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; }