Moh*_*san 0 c# asp.net validation asp.net-mvc
现在我在C#MVC中创建了一个名为"course"的创建表单,并且我调用了自定义验证 courseValidation
我收到错误:
Validation failed for one or more entities.
See 'EntityValidationErrors' property for more details.
Run Code Online (Sandbox Code Playgroud)
模特"课程"
[Required]
[courseValidation()]
public string courseName { set; get; }
Run Code Online (Sandbox Code Playgroud)
控制器"courseController"
[HttpPost]
public ActionResult Create(Models.courses course)
{
course.userId = 13;
db.courses.Add(course);
db.SaveChanges();
return View();
}
Run Code Online (Sandbox Code Playgroud)
和我的自定义验证 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 ;
}
}
Run Code Online (Sandbox Code Playgroud)
我总是有错误savechanges(),但是当我从模型中删除自定义验证时,没有发生错误.
你所做的不是验证,而是验证.避免在属性代码中具有依赖性的重逻辑.
验证涉及"静态"问题:数据格式,长度,非常基本的逻辑,你使用正则表达式的东西.即:数据有效,但不一定经过验证.
验证是验证提供的数据的地方,这需要您连接到数据库或其他外部数据以进行检查,因为需要额外的工作量,这是一个昂贵的过程,应该作为主要业务逻辑的一部分出现(如这些是您正在执行的业务规则.
因此,您的ViewModel应如下所示:
[Required]
public String CourseName { set; get; }
Run Code Online (Sandbox Code Playgroud)
你的控制器看起来像:
[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;
}
Run Code Online (Sandbox Code Playgroud)
重要说明:不要将DB实体类用作ViewModels!您的ViewModel应该是单独的POCO类,它们只包含视图的状态和数据.有许多理由不将DB实体用作ViewModel:
Users表的视图.您的表单需要两个密码字段("输入新密码"和"确认密码"),这些字段应该是文本,但是您的数据库没有密码列,它将具有二进制PasswordHash和PasswordSalt列,这与不匹配你的形式.| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |