2012-05-25 2 views
3

Je reçois une valeur codée HTML sur [RegularExpression] validateur MVC quand il écrit le code au client. Ce n'est pas un problème pour le message d'erreur (car il doit être codé pour un affichage plus tard), mais il est vraiment visse le regex :) Sur un champ de chaîne, mon expression régulière ressemble à ceci:RegularExpression validateur encodage regex < & > symboles comme < >, ce qui provoque la validation jQuery échec

[RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")] 

lorsque cela s'écrit par MVC3, il apparaît ressembler à ceci:

<input ... data-val-regex-pattern="^[^\&amp;lt;\&amp;gt;]*$" 
      data-val-regex="May not contain &amp;lt;,&amp;gt;" .../> 

Edit:

  • en raison de l'encodage, il attrapait aussi <>, mais le déclenchement aussi sur les mots avec:
  • t comme tim
  • g comme chèvre
  • probablement ; mais je ne l'ai pas testé il

Le but de cette regex est de filtrer et <>, plutôt que de désactiver toutes les validations sur la page et préforme sur le côté serveur. Ce champ accepte plusieurs langages Unicode et ne comporte que 12 caractères.

Mes choix ressemblent:

  1. test de sanité d'entrée Désactiver les asp.net sur une seule page et vérifier que l'action ne
  2. Trouver un regex complexe pour correspondre 3+ unicode gammes +/- tirets & numéros - .net + js compat.
  3. Ecrire un validateur regex personnalisé qui ne dispose pas de validation côté client
  4. Utilisez un [Remote] validateur pour le faire sur le côté serveur comme nous le faisons pour d'autres domaines

Je penche vers # 3 maintenant, mais je voudrais vraiment trouver un moyen de garder la fonctionnalité intégrée. Est-il possible de désactiver cette sortie d'échappement?

+0

vous pouvez également utiliser la validation à distance pour ce faire – cpoDesign

+0

Oui, bien sûr. Cela semble assez excessif pour une regex, mais cela devrait être sur la liste des solutions possibles. –

Répondre

4

Il m'a fallu un certain temps, mais j'ai découvert ce qui semble évident maintenant: utiliser au lieu des caractères réels <>.

Mon regex a fini comme ça, et travaille à la fois .Net & JS

// \u003c = <, \u003e = > 
[RegularExpression(@"^[^\u003C\u003E]*$", ErrorMessage = "...")] 

J'ai fini avec une validation personnalisée attribut pour éviter d'avoir ce code partout. Mieux serait un custom "par défaut" adaptateur d'objet & validation jquery personnalisée pour cette regex, permettant ainsi une deuxième regex pour le format à joindre. Travaille pour un autre jour. Voici la validation de la classe personnalisée &:

sous-classe personnalisée de l'attribut d'expression régulière:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class RegexUnsafeChars : RegularExpressionAttribute 
{ 
    public RegexUnsafeChars() : base(@"^[^\u003C\u003E]*$") 
    { 
     base.ErrorMessage = "May not contain <,>"; 
    } 
} 

Parce que c'est un attribut personnalisé, et le fournisseur vérifie uniquement pour les matchs EXACT, nous devons déclarer l'adaptateur manuellement. Heureusement, nous pouvons réutiliser le regex intégré. Ajoutez ce code à Application_Start() dans Global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
      typeof(RegexUnsafeChars), 
      typeof(RegularExpressionAttributeAdapter)); 
0

jQuery validation devrait fonctionner correctement et il a bien fonctionné lorsque j'ai testé. Les valeurs sont correctement codées.

Modèle:

public class MyViewModel 
{ 
    [DataType(DataType.MultilineText)] 
    [RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")] 
    public string Text { get; set; } 
} 

Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     model.Text = "<Hello"; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

Vue:

@model MyViewModel 

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Text) 
    @Html.ValidationMessageFor(x => x.Text) 
    <button type="submit">OK</button> 
} 

Résultat:

enter image description here

La validation côté client discrète fonctionne correctement.

+0

qu'est-ce que jquery.validate.unobtrusive.js – Hogan

+0

Il s'agit d'un script Microsoft qui interprète les attributs HTML5 data- * contenus dans les champs de saisie (voir le balisage OP) et les convertit en règles jquery.validate. Fondamentalement, les attributs d'annotation de données émettent des attributs data- * sur les champs d'entrée correspondants et une validation côté client discrète est effectuée sur le client. C'est le modèle par défaut dans ASP.NET MVC 3. –

+0

Pouvez-vous me montrer votre code HTML pour ce tag? Il a également validé correctement pour <>, mais, à cause de l'encodage, échoue sur 'l',' g' et 't' pour moi (plus'; ') –

Questions connexes