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()的错误,但是当我从模型中删除我的自定义验证时,没有错误发生。

c# MVC自定义验证错误

您正在做的不是验证,而是验证。避免在属性代码中使用依赖关系的繁重逻辑。

验证关注的是"静态"问题:数据格式、长度、非常基本的逻辑,也就是你会使用正则表达式来处理的事情。即:数据是有效的,但不一定经过验证。

验证是您验证提供的数据的地方,这需要您连接到数据库或其他外部数据来检查它,由于需要额外的腿部工作,这是一个昂贵的过程,应该作为您的主要业务逻辑的一部分出现(因为这些是您正在执行的业务规则)。

所以你的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"确认密码"),这应该是文本,但你的数据库不会有密码列,它将有一个二进制PasswordHashPasswordSalt列,这与你的表单根本不匹配。