c# MVC自定义验证错误
本文关键字:错误 验证 自定义 MVC | 更新日期: 2023-09-27 18:18:13
现在我在c# MVC中创建了一个表单名为"course"我有一个自定义验证叫做courseValidation
我得到错误:
Validation failed for one or more entities.
See 'EntityValidationErrors' property for more details.
模型"课程"
[Required]
[courseValidation()]
public string courseName { set; get; }
控制器"courseController"
[HttpPost]
public ActionResult Create(Models.courses course)
{
course.userId = 13;
db.courses.Add(course);
db.SaveChanges();
return View();
}
和我的自定义验证courseValidation
public override bool IsValid(object value)
{
int query = (from res in db.courses
where res.courseName == value.ToString()
select res).Count();
if (query == 0)
{
return true;
}
else
{
return false ;
}
}
我总是有savechanges()
的错误,但是当我从模型中删除我的自定义验证时,没有错误发生。
您正在做的不是验证,而是验证。避免在属性代码中使用依赖关系的繁重逻辑。
验证关注的是"静态"问题:数据格式、长度、非常基本的逻辑,也就是你会使用正则表达式来处理的事情。即:数据是有效的,但不一定经过验证。
验证是您验证提供的数据的地方,这需要您连接到数据库或其他外部数据来检查它,由于需要额外的腿部工作,这是一个昂贵的过程,应该作为您的主要业务逻辑的一部分出现(因为这些是您正在执行的业务规则)。
所以你的ViewModel应该看起来像:
[Required]
public String CourseName { set; get; }
你的控制器应该看起来像:
[HttpPost]
public ActionResult Create(CoursesViewModel viewModel)
{
if( !this.IsCoursesViewModelValid( this.db, viewModel ) ) {
this.ModelState.AddError("some error message");
return this.View();
}
DBCourse dbCourse = new DBCourse();
dbCourse.Name = viewModel.CourseName;
db.Courses.Add( dbCourse );
db.SaveChanges();
return this.View();
}
private Boolean IsCoursesViewModelValid(DataContext db, CoursesViewModel viewModel) {
return db.Courses.Where( dbC => dbC.CourseName == viewModel.CourseName ).Count() == 0;
}
重要提示:不要使用数据库实体类作为ViewModels!你的ViewModels应该是单独的POCO类,只包含视图的状态和数据。不使用数据库实体作为viewmodel的原因有很多:
- 安全。恶意用户可以利用默认的模型绑定行为 设置任何实体数据成员。
- 它保持关注点分离。视图应该对数据库一无所知。如果重构DB模式,则需要更新视图,因为引用将被破坏
- 数据成员和视图模型字段不匹配:考虑
Users
表的视图。你的表单需要两个密码字段("输入新密码"answers"确认密码"),这应该是文本,但你的数据库不会有密码列,它将有一个二进制PasswordHash
和PasswordSalt
列,这与你的表单根本不匹配。