2012-03-05 22 views
5

Quiero usar ComponentModel DataAnnotations validar que al menos una de las dos propiedades tiene un valor. Mi modelo es el siguiente:O bien O validación requerida

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

Básicamente, Quiero validar FooModel de manera que sea Bar1 o Bar2 se requiere. En otras palabras, puede ingresar una u otra, o ambas cosas, pero no puede simplemente dejar ambas vacías.

Preferiría que esto funcionara tanto para la validación del lado del cliente como para la del lado del cliente.


EDIT: Esto puede ser un possible duplicate, as this looks similar to what I'm looking to do

+2

Eso es validador propio derecho es su amigo. – veblock

+1

Hay un validador personalizado llamado RequiredIf que resolvería su problema. – Joe

+0

@JoeTuskan, tienes razón, encontré [esta publicación en el blog] (http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc -3.aspx) en su orientación y resuelve mi problema. Si desea escribir una respuesta para poder darle crédito, eso está bien para mí. Si no, ten mi +1. –

Respuesta

4

que se necesita para extender la clase ValidationAttribute y otra montar el método IsValid, e implementar el IClientValidatable si desea bombear JavaScript personalizado para hacer la validación. algo como abajo.

[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" 
      }; 
     } 
    } 

Uso:

[AtLeastOneOrTwoParamsHasValue(ErrorMessage="Atleast one param must be specified.")] 
Cuestiones relacionadas