当我发布并收到模型时,此模型包含错误。 我通过以下方式删除这些错误。
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的过程时,我有一个真实的,也就是说,我的模型是有效的。 在此过程之后,我按以下方式保留模型。
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;
}
我不明白,每当我继续进入捕获时清除了ModelState的错误,我就会看到我之前理论上清理过的模型的错误字段。 为什么呢?
答案 0 :(得分:2)
因为在验证模型时存在两个步骤。
第一步是通过ASP.Net MVC验证完成的,在您的操作方法中使用它之前验证。实际上,在您的代码中,您只需清理ASP.Net MVC检测到的错误列表,但您没有为受错误影响的模型属性设置正确的值。
在第一步验证之后,实体框架验证将在通过调用SaveChanges
将实体保存到数据库时执行。 EF也使用与ASP.Net MVC相同的方式使用数据注释,它还使用模型的配置来验证您的实体。就像我已经说过的那样,你刚刚清除了错误信息但没有设置正确的值,所以使用EF你最终会遇到相同的错误。
清除操作方法中的错误消息对此没有多大帮助,除非您为错误所涉及的每个属性设置了正确的值。
无论如何,如果要禁用EF验证,可以通过在DbContext
构造函数中设置此配置来执行此操作:
this.Configuration.ValidateOnSaveEnabled = false;
建议不要这样做,因为您可能会在数据库中保存不正确的数据。您也可能从数据库中获得例外,例如当您的数据库具有必需列但您从映射到该列的属性发送null
值时。