【问题标题】:Using a ASP .NET MVC model value to validate another model value?使用 ASP .NET MVC 模型值来验证另一个模型值?
【发布时间】:2011-02-16 17:08:58
【问题描述】:

我有一个这样的模型类:

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

更新:

我的解决方案采用了不同的方法。有用的答案让我在其他地方寻找。来自 Scott Gu 的 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!");
            }

【问题讨论】:

  • 调用Validate(..)时如何传入validationContext?

标签: c# validation model asp.net-mvc-3


【解决方案1】:

@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);
    }    
}

【讨论】:

  • 我快接近了。 'var (model) = (SomeClass..' 行编译得很好,但是当我实际运行程序并在其中输入一些值时会抛出 'InvalidCastException'。有什么想法吗?
  • @John M:ObjectInstance 的类型应该是您的 ViewModel 的类型。因此,如果您使用“SomeClass”作为视图模型,那应该没问题。你能在调试器中看到 ObjectInstance 的实际类型是什么吗?
【解决方案2】:

在 .NET 4.0 中有 another overload 用于 IsValid,它采用 ValidationContext 参数。这有一个 ObjectInstance 属性,您可以将其强制转换为 SomeClass 并允许您访问它的其他属性。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2014-11-08
    • 1970-01-01
    • 2020-06-23
    • 2012-12-26
    • 2020-08-30
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多