MVC3 Validation du Besoin de l'Une De Groupe
Le suivant viewmodel:
public class SomeViewModel
{
public bool IsA { get; set; }
public bool IsB { get; set; }
public bool IsC { get; set; }
//... other properties
}
Je souhaite créer un attribut personnalisé qui valide au moins l'une des propriétés disponibles sont remplies. Je prévois être en mesure de joindre un attribut à une propriété et d'attribuer un nom de groupe comme suit:
public class SomeViewModel
{
[RequireAtLeastOneOfGroup("Group1")]
public bool IsA { get; set; }
[RequireAtLeastOneOfGroup("Group1")]
public bool IsB { get; set; }
[RequireAtLeastOneOfGroup("Group1")]
public bool IsC { get; set; }
//... other properties
[RequireAtLeastOneOfGroup("Group2")]
public bool IsY { get; set; }
[RequireAtLeastOneOfGroup("Group2")]
public bool IsZ { get; set; }
}
Je tiens à valider sur le côté client avant la soumission du formulaire en tant que valeurs dans le formulaire de changer et c'est pourquoi je préfère éviter un niveau de classe de l'attribut si possible.
Cela nécessite à la fois côté serveur et côté client validation de localiser toutes les propriétés ayant un objet identique nom de groupe de valeurs transmis en tant que paramètre de l'attribut personnalisé. Est-ce possible? De toute orientation est très apprécié.
Vous devez vous connecter pour publier un commentaire.
Voici une façon de procéder (il y a d'autres façons, je suis juste illustrant un seul qui correspondent à votre modèle de vue, comme l'est):
Maintenant, nous allons définir un contrôleur:
et une vue:
La dernière partie que la gauche serait à inscrire des adaptateurs pour le côté client de validation:
En fonction de vos exigences, le code pourrait être adapté.
var properties = params.propertynames.split(',');
devrait êtrevar properties = params.properties.split(',');
@Html.ValidationMessageFor(x => x.OneMemberOfTheGroup)
vous pouvez ensuite ajouter untrue
pour le résumé de l'appel d'exclure les erreurs de propriété. pas l'idéal, je sais, mais c'est un moyen de contourner le problèmerule.ValidationType = string.Format("group", GroupName.ToLower());
qui ne semble pas juste, car le nom du groupe n'est pas dans les cordes de n'importe où. Ce qui est censé être?Utilisation de
require_from_group
de jquery-équipe de validation:jQuery validation projet a un sous-dossier dans src dossier appelé supplémentaires.
Vous pouvez le vérifier ici.
Dans ce dossier, nous avons beaucoup de supplémentaires de validation des méthodes qui ne sont pas communs, c'est pourquoi ils ne sont pas ajoutés par défaut.
Comme vous le voyez dans ce dossier, il existe de nombreuses méthodes que vous devez choisir en choisissant la méthode de validation que vous avez réellement besoin.
Basé sur votre question, la méthode de validation que vous avez besoin est nommé
require_from_group
de dossier supplémentaire.Il suffit de télécharger ce fichier associé qui est situé ici et le mettre dans votre
Scripts
dossier de l'application.La documentation de cette méthode explique ceci:
Pourquoi vous devez choisir cette mise en œuvre :
Cette méthode de validation est générique et fonctionne pour tous les
input
(texte, case à cocher, radio, etc),textarea
etselect
. Cette méthode vous permet également de spécifier le nombre minimum d'intrants requis qui doivent être remplis e.gJ'ai créé deux classes
RequireFromGroupAttribute
etRequireFromGroupFieldAttribute
qui vous aidera à la fois côté serveur et côté client validationsRequireFromGroupAttribute
définition de la classeRequireFromGroupAttribute
seulement dérive deAttribute
. La classe est d'utiliser seulement pour la configuration, par exemple en fixant le nombre de champs qui doivent être remplis pour la validation. Vous devez fournir à cette classe le sélecteur CSS classe qui sera utilisée par la méthode de validation pour obtenir tous les éléments du même groupe. Parce que le nombre par défaut des champs requis est de 1 alors cet attribut est utilisé uniquement pour la décoration de votre modèle si le minimum requis dans les spcefied groupe est plus grand que le nombre par défaut.RequireFromGroupFieldAttribute
définition de la classeRequireFromGroupFieldAttribute
qui dérive deValidationAttribute
et met en œuvreIClientValidatable
. Vous devez utiliser cette classe dans chaque propriété dans votre modèle, qui participe à votre groupe de validation. Vous devez passer le sélecteur css de la classe.Comment l'utiliser dans votre modèle de vue?
Dans votre modèle, voici comment l'utiliser :
Par défaut, vous n'avez pas besoin de décorer votre modèle avec
RequireFromGroupAttribute
parce que le nombre par défaut des champs requis est de 1. Mais si vous voulez un certain nombre de champs à être différent de 1, vous pouvez effectuer les opérations suivantes :Comment l'utiliser dans votre code?
Avis de la sélection de groupe que vous avez spécifié lors de l'utilisation de
RequireFromGroupField
de l'attribut est à utiliser dans votre vue en spécifiant comme une classe dans chaque entrée impliqués dans vos groupes.C'est tout pour le côté serveur de validation.
Nous allons parler de la validation côté client.
Si vous cochez la
GetClientValidationRules
mise en œuvre dansRequireFromGroupFieldAttribute
classe, vous allez le voir, je suis l'aide de la chaînerequirefromgroup
et pasrequire_from_group
que le nom de la méthode pour laValidationType
de la propriété. C'est parce que ASP.Net MVC permet uniquement le nom du type de validation pour contenir alphanumérique char et ne doit pas commencer par un chiffre. Donc, vous devez ajouter le code javascript suivant :La partie javascript est très simple, parce que dans la mise en œuvre de l'adaptateur de la fonction nous venons de déléguer la validation de la correcte
require_from_group
méthode.Car il fonctionne avec tous les types de
input
,textarea
etselect
éléments, je pense que de cette façon est plus générique.Espère que ça aide!
J'ai mis en place Darin est génial de réponse à ma demande, sauf que j'ai ajouté pour les chaînes et non les valeurs booléennes. C'était pour des choses comme les nom/société, ou par téléphone/e-mail. Je l'ai aimé, sauf pour un mineur de pinailler.
J'ai essayé de les soumettre mon formulaire sans un téléphone, téléphone mobile, téléphone à la maison, ou e-mail. J'ai eu quatre erreurs de validation côté client. C'est bien pour moi, car il permet aux utilisateurs de savoir exactement dans quel domaine(s) peut être complétée pour faire disparaître l'erreur.
J'ai tapé une adresse e-mail. Maintenant, la seule validation en vertu de l'e-mail est allé loin, mais les trois sont restés sous les numéros de téléphone. Ces ne sont plus des erreurs de plus.
Donc, j'ai réassigné la méthode jQuery que des contrôles de validation pour tenir compte de cela. Le Code ci-dessous. Espérons que cela aide quelqu'un.
Je sais que c'est un vieux thread mais je viens de tomber sur le même scénario et trouvé quelques solutions et en a vu un qui résout Matt est question ci-dessus donc je pensais que je voudrais partager pour ceux qui viennent à travers cette réponse. Découvrez: MVC3 discret groupe de validation des entrées