Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NETMVC模型值验证另一个模型值?_C#_Validation_Model_Asp.net Mvc 3 - Fatal编程技术网

C# 使用ASP.NETMVC模型值验证另一个模型值?

C# 使用ASP.NETMVC模型值验证另一个模型值?,c#,validation,model,asp.net-mvc-3,C#,Validation,Model,Asp.net Mvc 3,我有一个这样的模型课: public class SomeClass { public int EmployeeId {get;set;} public int DayTotal {get;set} } 对于这个模型类,我正在为“DayTotal”属性创建一个自定义ValidationAttribute。自定义验证器将根据定义允许的最大天数的另一个表检查输入的值“DayTotal” 在验证程序中编写查询时,如何从Create视图中引用所选的“EmployeeId” public

我有一个这样的模型课:

public class SomeClass
{
    public int EmployeeId {get;set;}
    public int DayTotal {get;set}
}
对于这个模型类,我正在为“DayTotal”属性创建一个自定义ValidationAttribute。自定义验证器将根据定义允许的最大天数的另一个表检查输入的值“DayTotal”

在验证程序中编写查询时,如何从Create视图中引用所选的“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的这一观点有助于提供一种更简单的方法:

在我的模型中->

   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!");
            }
public类SomeClass:IValidateObject
{
public int EmployeeId{get;set;}
public int daytottal{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
ProjectDBContext db=新建ProjectDBContext();
//检查maxes…可以在LINQ查询中直接引用EmployeeId
如果(失败)
{
返回新的ValidationResult(“天数已达到最大值!”);
}
在.NET 4.0中,有一个接受参数的for-IsValid。它有一个属性,您可以将该属性转换为某个类,并允许您访问其其他属性。

完全正确,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的实际类型吗?调用Validate(..)时,如何在validationContext中传递?