自定义验证c#MVC出错

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

Dai*_*Dai 5

你所做的不是验证,而是验证.避免在属性代码中具有依赖性的重逻辑.

验证涉及"静态"问题:数据格式,长度,非常基本的逻辑,你使用正则表达式的东西.即:数据有效,但不一定经过验证.

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

因此,您的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表的视图.您的表单需要两个密码字段("输入新密码"和"确认密码"),这些字段应该是文本,但是您的数据库没有密码列,它将具有二进制PasswordHashPasswordSalt列,这与不匹配你的形式.