2011-02-16 69 views
7

我有这样一个模型类:使用ASP .NET MVC模型值验证另一个模型值?

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

对于这个模型类,我为“DayTotal”属性创建自定义ValidationAttribute。自定义验证程序将检查输入值'DayTotal'的值与另一个定义允许的最大天数的表。

如何在验证器中编写我的查询时从创建视图中引用选定的'EmployeeId'?

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 = ??? 
    } 
} 

UPDATE:

我的解决方案已经采取了不同的方法。有用的答案让我在其他地方寻找。这blog从斯科特谷有助于提供一个更简单的方法:

在我的模型 - >

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

调用验证(..)当validationContext如何传递? – RayLoveless 2018-01-10 19:46:24

回答

6

@Luke Bennett是完全正确的,ValidationContext在MVC 3

这里是新的一个使用你的代码的例子:

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

我正在接近。 'var(model)=(SomeClass ..'这一行编译得很好,但是当我真的运行程序并输入一些值时会抛出'InvalidCastException'。任何想法? – 2011-02-16 18:59:03