Asp.net mvc 3 IValidatableObject在mvc 4 web app中不工作
所以我有一个注册用户和业务合作伙伴的web应用程序 这就是我的模特的样子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
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;
}