1

J'utilise DataAnnotations pour la validation (y compris côté client)asp.net mvc2 validations

J'ai un formulaire avec plusieurs champs. La validation de base pour les champs individuels fonctionne correctement. Maintenant, il y a quelques champs dont au moins un doit avoir une valeur (s'il y a 3 champs alors le 1er ou le 2ème ou 3ème champ devrait avoir une valeur).

J'ai lu pas mal de messages sur ce site et quelques entrées de blog. Mais je ne pouvais pas trouver une solution qui fonctionne dans le scénario mentionné ci-dessus. J'ai peut-être manqué quelque chose ou je l'ai mal fait.

Pouvez-vous nous aider avec ceci?

Répondre

2

essayer cette

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class EitherOr : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{0}' OR '{1}' OR '{2}' must have a value"; 
    private readonly object _typeId = new object(); 

    public EitherOr(string prop1, string prop2, string prop3) 
     : base(_defaultErrorMessage) 
    { 
     Prop1 = prop1; 
     Prop2 = prop2; 
     Prop3 = prop3; 

    } 

    public string Prop1 { get; private set; } 
    public string Prop2 { get; private set; } 
    public string Prop3 { get; private set; } 

    public override object TypeId 
    { 
     get 
     { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, Prop1, Prop2,Prop3); 
    } 

    public override bool IsValid(object value) 
    { 
     if(string.IsNullOrEmpty(Prop1)&&string.IsNullOrEmpty(Prop2) && string.IsNullOrEmpty(Prop3)) 
     { 
      return false; 
     } 
     return true; 
    } 

puis marquer votre classe avec l'attribut EitherOr:

[EitherOr("Bar","Stool","Hood", ErrorMessage = "please supply one of the properties")] 
    public class Foo 
    { 
     public string Bar{ get; set;} 
     public string Stool{ get; set;} 
     public string Hood{ get; set;} 
    } 

S'il vous plaît noter que je servais des propriétés de chaîne, si votre propriété est d'un autre type, makle-vous de changer la validation IsValid(object value)

+0

Merci Dusty, quel script de validation javacript devrais-je écrire dans ce cas? devrais-je encore implémenter DataAnnotationsModelValidator et l'enregistrer? – byte

+0

Vous ne devriez pas avoir à écrire de javascript si vous utilisez le 'Html.ValidationSummary' par défaut. l'erreur messagfe sera affichée dans votre résumé de validation. cependant, si vous voulez l'afficher à côté de chacun des champs de formulaire, vous devrez utiliser: ModelState.AddModelError ("Bar", "nécessite une valeur"); –

+0

Merci. Cette validation a-t-elle lieu au niveau du serveur? Je suis en train de regarder la validation des entrées du côté client afin de donner une meilleure interface utilisateur et d'éviter les déplacements du serveur lorsque cela est possible. La validation côté serveur sera toujours là. – byte