2014-06-16 1 views
4

J'ai un modèle MVC 4 et j'en crée un HTML dans la vue en utilisant @ Html.TextBoxFor. Dans le modèle pour l'un des domaines que j'ai un attribut RegularExpression défini comme suit:Est-il possible de désactiver la validation côté client pour une seule propriété de modèle dans MVC?

[Required(ErrorMessageResourceType=typeof(ResourceFile), ErrorMessageResourceName="ResourceName1" 
[RegularExpression(@"\w{3,5}", ErrorMessageResourceType=typeof(ResourceFile), ErrorMessageResourceName="ResourceName2")] 
public string TestProperty { get; set; } 

Notez l'expression est plus complexe que cela, mais ce que j'ai ici est adapté pour les tests. J'ai mis en place la validation côté client discrète comme décrit ici: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

Le problème que j'ai est que j'ai besoin d'accepter les caractères russes. Les expressions régulières de .Net ont une signification différente pour \ w dans les expressions régulières de javascript et, en tant que telle, la validation côté serveur fonctionne comme je l'espère et le côté client ne fonctionne pas.

Est-il possible de désactiver la validation côté client pour l'attribut RegularExpression sans le désactiver pour l'attribut Required?

A défaut, est-il possible de désactiver la validation côté client pour cette propriété unique sans désactiver toutes les autres propriétés de cet objet modèle?

+0

Pouvez-vous supprimer l'attribut regex et juste valider manuellement? –

+0

Bien sûr, mais j'espérais une meilleure solution que cela. –

+0

Je pense que vous allez avoir à faire votre propre validation, lancer votre propre attribut personnalisé qui prend russe dans le compte ou modifier l'expression régulière pour correspondre à ce que vous essayez de faire correspondre. –

Répondre

6

Créez votre propre attribut d'expression régulière côté serveur uniquement. Dérivez-le de RegularExpressionAttribute mais n'implémentez pas IClientValidatable. Vous n'avez qu'à implémenter le constructeur. Sans IClientValidatable, les validateurs côté client ne seront pas câblés. Puisque cet attribut n'est rien d'autre qu'un attribut d'expression régulière, toutes les validations côté serveur continueront à fonctionner comme prévu par RegularExpressionAttribute.

public class ServerSideOnlyRegularExpressionAttribute : RegularExpressionAttribute 
{ 
    public ServerSideOnlyRegularExpressionAttribute(string pattern) 
     : base(pattern) 
    { 
    } 
} 

utiliser comme

[Required(ErrorMessageResourceType=typeof(ResourceFile), ErrorMessageResourceName="ResourceName1" 
[ServerSideOnlyRegularExpression(@"\w{3,5}", ErrorMessageResourceType=typeof(ResourceFile), ErrorMessageResourceName="ResourceName2")] 
public string TestProperty { get; set; } 
Questions connexes