【问题标题】:ModelState is valid but when I save the data I get it in the entityValidationErrors that has errorsModelState 是有效的,但是当我保存数据时,我在有错误的 entityValidationErrors 中得到它
【发布时间】:2018-05-04 08:54:56
【问题描述】:

当我发布并收到模型时,此模型包含错误。 我通过以下方式删除这些错误。

if (!ModelState.IsValid)
{
   int pos = 0;
   while (pos < ModelState.Keys.Count())
   {
      if (ModelState[ModelState.Keys.ElementAt(pos)].Errors.Any())
      {
          ModelState[ModelState.Keys.ElementAt(pos)].Errors.Clear();
      }
      pos++;
   }  
}            

bool mod = ModelState.IsValid;

当我在 bool 中执行 while 的过程时,我有一个 true,即我的模型是有效的。 在此过程之后,我按以下方式保留模型。

            reg x = _context.register.Create();
            x = _context.register.Add(data);

            try
            {  
                _context.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage);
                    }
                }
                throw;
            }

我不明白,每当我继续输入 catch 时清理了 ModelState 的错误,并且我看到了我之前理论上清理过的模型的错误字段。 为什么?

【问题讨论】:

  • ModelState 在 POST 方法中绑定模型时会产生错误。仅删除错误消息不会更改模型的状态 - 您的值仍然无效,因此当您保存到数据库时,您会得到一个 DbEntityValidationException
  • 发生验证错误后,您没有使用ModelState.Clear() 方法,这就是验证问题仍然存在的原因。清除验证消息并没有帮助,因为它只是禁止查看它们,而不是更改任何传递给实体模型的值。

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 modelstate


【解决方案1】:

因为验证模型时存在两个步骤。

第一步由 ASP.Net MVC Validation 完成,它会在您在操作方法中使用它之前进行验证。实际上,在您的代码中,您只是清除了 ASP.Net MVC 检测到的错误列表,但您没有为受错误影响的模型属性设置正确的值。

在第一步验证之后,是实体框架验证,它在将实体保存到数据库时通过调用SaveChanges 执行。 EF 也使用与 ASP.Net MVC 相同的方式,通过使用数据注释,它还使用模型的配置来验证您的实体。就像我已经说过的那样,您只是清除了错误消息,但没有设置正确的值,因此使用 EF 您最终会遇到相同的错误。

在您的操作方法中清除错误消息并没有太大帮助,除非您为与错误相关的每个属性设置正确的值。

无论如何,如果您想禁用 EF 验证,您可以通过在 DbContext 构造函数中设置此配置来实现:

this.Configuration.ValidateOnSaveEnabled = false;

不建议这样做,因为您可能会在数据库中保存不正确的数据。您也可能从数据库中获得异常,例如当您的数据库有一个必需的列,但您从映射到该列的属性中发送了一个 null 值。

【讨论】:

  • 非常感谢。这样做可以正常工作,但是正如您所说,这是非常危险的。有没有其他方法可以清除这些错误?还是我必须在控制器中手动进行验证以查看所有数据是否正确?
  • 最佳实践是当您输入您的操作并通过ModelState.IsValid 检测到模型无效时,您应该将相同的视图返回给用户并提供正确的错误消息。只要模型是无效的,你总是给用户回退,让他/她自己修复无效数据。
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多