2012-03-05 14 views
5

Desidero utilizzare ComponentModel DataAnnotazioni convalidare che almeno una delle due proprietà ha un valore. Il mio modello è simile al seguente:Convalida O O Richiesto

public class FooModel { 
    public string Bar1 { get; set; } 
    public int Bar2 { get; set; } 
} 

In sostanza, voglio convalidare FooModel in modo che sia Bar1 o Bar2 è richiesto. In altre parole, puoi inserire uno, o l'altro o entrambi, ma non puoi lasciarli entrambi vuoti.

Preferirei che questo funzionasse sia per la convalida lato client che discreto sul lato client.


EDIT: Questo può essere un possible duplicate, as this looks similar to what I'm looking to do

+2

Proprio così validatore personalizzato è tuo amico qui. – veblock

+1

C'è un validatore personalizzato chiamato RequiredIf che potrebbe risolvere il tuo problema. – Joe

+0

@JoeTuskan, hai ragione, ho trovato [questo post del blog] (http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc -3.aspx) sulla tua guida e risolve il mio problema. Se vuoi scrivere una risposta in modo che io possa darti credito, per me va bene. In caso contrario, ho il mio +1. –

risposta

4

si avrebbe bisogno di estendere la classe ValidationAttribute e oltre cavalcare il metodo IsValid, e implementare l'IClientValidatable se si vuole pompare JavaScript personalizzato per fare la convalida. qualcosa come sotto.

[AttributeUsage(AttributeTargets.Property)] 
    public sealed class AtLeastOneOrTwoParamsHasValue : ValidationAttribute, IClientValidatable 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var param1 = validationContext.ObjectInstance.GetType().GetProperty("Param1").GetValue(value, null); 
      //var param2 = validationContext.ObjectInstance.GetType().GetProperty("Param2").GetValue(value, null); 

      //DO Compare logic here. 

      if (!string.IsNullOrEmpty(Convert.ToString(param1))) 
      { 
       return ValidationResult.Success; 
      } 


      return new ValidationResult("Some Error"); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      //Do custom client side validation hook up 

      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       ValidationType = "validParam" 
      }; 
     } 
    } 

Usage:

[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")] 
Problemi correlati