Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Asp.net mvc 3 IValidatableObject在mvc 4 web app中不工作_Asp.net Mvc 3_Validation_Asp.net Mvc 4_Ivalidatableobject - Fatal编程技术网

Asp.net mvc 3 IValidatableObject在mvc 4 web app中不工作

Asp.net mvc 3 IValidatableObject在mvc 4 web app中不工作,asp.net-mvc-3,validation,asp.net-mvc-4,ivalidatableobject,Asp.net Mvc 3,Validation,Asp.net Mvc 4,Ivalidatableobject,所以我有一个注册用户和业务合作伙伴的web应用程序 这就是我的模特的样子 public class UserModel : IValidatableObject { //here are some properties and methods that I am using in Validate method public CompanyModel Company { get; set; } //this is user Company public

所以我有一个注册用户和业务合作伙伴的web应用程序

这就是我的模特的样子

public class UserModel : IValidatableObject
{
   //here are some properties and methods that I am using in Validate method        

    public CompanyModel Company { get; set; } //this is user Company

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {       
         if (this.UserWithEmailExists())
             yield return new ValidationResult("Email already exists", new[] { "Email" });

         if (this.UserWithUsernameExists())
             yield return new ValidationResult("Username already exists", new[] { "Username" });
    }
}

public class CompanyModel : IValidatableObject
{
    //again here are some properties that i am using in Validate

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (this.Phone == null && this.Mobile == null)
            yield return new ValidationResult("The Phone field is required", new[] { "Phone" });
    }
}

//this is the model passed to the view
public sealed class RegistrationModel : UserModel, IValidatableObject
{
    public new IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (this.Password != this.PasswordValidation)
            yield return new ValidationResult("Ponovite prejšnji vnos", new[] { "PasswordValidation" });
    }
}
公共类UserModel:IValidatableObject
{
//下面是我在Validate方法中使用的一些属性和方法
public CompanyModel Company{get;set;}//这是用户公司
公共IEnumerable验证(ValidationContext ValidationContext)
{       
if(this.UserWithEmailExists())
返回新的ValidationResult(“电子邮件已存在”,新[]{“电子邮件”});
if(this.UserWithUsernameExists())
返回新的ValidationResult(“用户名已存在”,新[]{“用户名”});
}
}
公共类CompanyModel:IValidatableObject
{
//这里是我在验证中使用的一些属性
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(this.Phone==null&&this.Mobile==null)
返回新的ValidationResult(“电话字段是必需的”,new[]{“Phone”});
}
}
//这是传递给视图的模型
公共密封类注册模型:UserModel,IValidatableObject
{
公共新IEnumerable验证(ValidationContext ValidationContext)
{
if(this.Password!=this.PasswordValidation)
返回新的ValidationResult(“Ponovite prejšnji vnos”,新[]{“PasswordValidation”});
}
}
问题是:当我提交表单时,在CompanyModel中验证被调用,在RegistrationModel中验证也被调用。但我也希望在UserModel中验证被调用

更新: 我解决了第一个问题:这些是升级后的型号:)

公共类UserModel:IValidatableObject
{
//下面是我在Validate方法中使用的一些属性和方法
public CompanyModel Company{get;set;}//这是用户公司
公共虚拟IEnumerable验证(ValidationContext ValidationContext)
{       
if(this.UserWithEmailExists())
返回新的ValidationResult(“电子邮件已存在”,新[]{“电子邮件”});
if(this.UserWithUsernameExists())
返回新的ValidationResult(“用户名已存在”,新[]{“用户名”});
}
}
公共类CompanyModel:IValidatableObject
{
//这里是我在验证中使用的一些属性
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(this.Phone==null&&this.Mobile==null)
返回新的ValidationResult(“电话字段是必需的”,new[]{“Phone”});
}
}
//这是传递给视图的模型
公共密封类注册模型:UserModel,IValidatableObject
{
公共覆盖新IEnumerable验证(ValidationContext ValidationContext)
{
//这是执行用户模型验证所必需的
foreach(base.Validate中的var结果(validationContext))
{
收益结果;
}
if(this.Password!=this.PasswordValidation)
返回新的ValidationResult(“Ponovite prejšnji vnos”,新[]{“PasswordValidation”});
}
}

现在验证工作正常。我只是不知道为什么在CompanyModel中验证会执行两次??。有什么建议吗?

重写基类中的方法时,不会显式调用该基类中的方法。您需要自己完成,因此在注册模型中的
Validate
函数中,在基本UserModel类中添加对
Validate
函数的调用

base.Validate(validationContext);
但是,当您在验证器中使用
yield return
时,这使得
Validate
函数成为迭代器,因此必须对其进行迭代,以使一切正常工作。根据,完整的解决方案是在注册模型中使用此代码。验证功能:

foreach (var result in base.Validate(validationContext))
{
    yield return result;
}

你将什么模型传递给你的视图?你的人…帮助我发现这是有意义的-你需要迭代迭代器使其工作。我编辑我的问题并添加代码…在Company Validate中运行了两次?…有什么想法吗?@TheMentor-你复习过吗?
foreach (var result in base.Validate(validationContext))
{
    yield return result;
}