2011-02-16 14 views
7

que tienen una clase de modelo así:¿Utiliza un valor de modelo ASP .NET MVC para validar otro valor de modelo?

public class SomeClass 
{ 
    public int EmployeeId {get;set;} 
    public int DayTotal {get;set} 
} 

Para esta clase de modelo Estoy creando una costumbre ValidationAttribute para la propiedad 'DayTotal'. El validador personalizado verificará el valor ingresado 'DayTotal' contra otra tabla que defina los días máximos permitidos.

¿Cómo me refiero al 'EmployeeId' seleccionado desde la vista Crear al escribir mi consulta en el validador?

public class DayTotalAttribute : ValidationAttribute 
{ 
    ProjectDBContext db = new ProjectDBContext(); 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
     { 
      return false; 
     } 

     var products = from p in db.EmployeeDayMax 
         where p.EmployeeId = ??? 
    } 
} 

ACTUALIZACIÓN:

Mi solución ha adoptado un enfoque diferente. Las respuestas útiles me hicieron buscar en otros lugares. Este blog de Scott Gu ayudado a proporcionar un enfoque más simple:

En mi modelo ->

public class SomeClass : IValidateObject 
    { 
     public int EmployeeId {get; set;} 
     public int DayTotal {get; set;} 

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
      ProjectDBContext db = new ProjectDBContext(); 
      //check maxes...can refer directly to EmployeeId in LINQ queries 
      if(failed) 
      { 
       yield return new ValidationResult("Days have been maxed!"); 
      } 
+0

¿Cómo se pasa en la validationContext al llamar Validar (..)? – RayLoveless

Respuesta

6

@Luke Bennett es completamente correcto, ValidationContext es nuevo en MVC 3.

Aquí hay un ejemplo usando el código:

public class DayTotalAttribute : ValidationAttribute 
{ 
    ProjectDBContext db = new ProjectDBContext(); 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value != null) 
     { 
      var model = (SomeClass)validationContext.ObjectInstance; 
      var products = from p in db.EmployeeDayMax 
         where p.EmployeeId = model.EmployeeId 

      bool somethingIsWrong = // do your validation here 

      if (somethingIsWrong) 
      { 
       return ValidationResult("Error Message"); 
      } 
     } 

     return base.IsValid(value, validationContext); 
    }  
} 
+0

Me estoy acercando. La línea 'var (model) = (SomeClass ..' compila bien pero arroja una 'InvalidCastException' cuando realmente ejecuto el programa e ingresa algunos valores. ¿Alguna idea? –

+0

@John M: El tipo de ObjectInstance debería ser el tipo de su ViewModel. Entonces, si usa'omeclase 'como modelo de su vista, debería estar bien. ¿Puede ver en el depurador cuál es el tipo real de ObjectInstance? – fretje

Cuestiones relacionadas