如何使Fluent API配置与MVC客户端验证一起工作

本文关键字:客户端 验证 一起 工作 MVC 何使 Fluent API 配置 | 更新日期: 2023-09-27 18:20:27

比起DataAnnotation,我更喜欢使用Fluent API配置,因为我想将模型和数据访问分离开来。

我曾经尝试过MVC,Fluent API不适用于客户端验证。简而言之,有没有一种简单的方法可以让Fluent API像DataAnnotation那样与客户端验证一起工作?

如何使Fluent API配置与MVC客户端验证一起工作

否。Fluent API只是映射正确。数据注释既是映射又是验证——这是错误的。数据注释首先是EF代码最糟糕的特性之一,因为当以这种方式使用时,它们将持久性与表示和验证逻辑相结合。

建议:不要使用EF实体进行演示。使用带有数据注释的特殊视图模型,并让控制器从实体中准备视图模型,反之亦然。迟早,您会发现验证与映射不是1:1,或者视图需要的数据比实体类型中提供的数据更多或更少。使用视图模型,这些情况将由它们处理。

我今天为此挣扎了一段时间,这不是严格的客户端验证,因为它需要往返,但它确实允许您从标准模板中的验证摘要和消息助手中受益。在控制器操作方法中,您只需将SaveChanges()调用封装在try-catch中,并将生成的Errors添加到ModelState中,如下所示:

try {
    //This does not pick up fluent validation failures
    if (ModelState.IsValid) {
        db.Entity.Add(entity);
        db.SaveChanges();
        //Users want to create loads of my entities without seeing the index...
        return RedirectToAction("Create");
    }
} catch (DbEntityValidationException e) {
    //Log errors
    foreach (var result in e.EntityValidationErrors) {
        foreach(var error in result.ValidationErrors){
            ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
        }
    }
}
//return to view with current model + validation errors 
return View(entity)

如果您在这里保存多个实体,这当然需要更多的工作。

当然,使用Ladislav建议的视图模型对象是正确的方法,但我已经使用它来支持提前进行下游系统集成测试所需的测试UI。。。