【问题标题】:Validation failed for one or more entities when trying to commit尝试提交时,一个或多个实体的验证失败
【发布时间】:2015-07-28 14:02:08
【问题描述】:

我正在创建的帮助台软件存在问题。当用户尝试编辑知识库并将其保存在我的存储库库中的提交方法上时,他们会收到此错误:

这是模型控制器代码,我将模型字段与视图模型字段匹配,然后提交更改:

 [HttpPost]
        public ActionResult EditTechKnowledgebase(EditKnowledgebase editknowledgebase)
        {

            if (ModelState.IsValid)
            {
                Knowledgebase knowledgebase = new Knowledgebase();
                knowledgebase.Category = editknowledgebase.Category;
                knowledgebase.CategoryId = editknowledgebase.CategoryId;
                knowledgebase.CreatedBy = editknowledgebase.CreatedBy;
                knowledgebase.CreatedById = editknowledgebase.CreatedById;
                //knowledgebase.CreatedDate = editknowledgebase.CreatedDate;
                knowledgebase.Description = editknowledgebase.Description;
                knowledgebase.Note = knowledgebase.Note;

                knowledgebases.Update(knowledgebase);
                knowledgebases.Commit();

                return RedirectToAction("TechKnowledgebaseList", new { createdById = editknowledgebase.CreatedById, categoryId = editknowledgebase.CategoryId, typeId = editknowledgebase.TypeId });
            }
            else
            {
                ViewBag.CategoryId = new SelectList(db.Categories.Where(c => c.Status == 1), "CategoryId", "CategoryName");
                ViewBag.TypeId = new SelectList(db.Roles, "RoleId", "RoleDescription");

                return View(editknowledgebase);
            }

        }

【问题讨论】:

  • 数据库中的架构是什么?通常,该错误表明架构的某些方面已被违反(例如,未给不可为空的列赋值)。

标签: c# asp.net-mvc controller viewmodel


【解决方案1】:

问题是由您保存的内容与数据库架构不匹配引起的。例如,它可能试图在非空字段中保存空值,或者将双精度值保存到 int 字段中,或者将小于 1900-01-01 的日期保存在日期时间字段中。

您可以像这样捕获 DBValidationExceptions:

try
{
    knowledgebases.Update(knowledgebase);
    knowledgebases.Commit();
}
catch (DbEntityValidationException ex)
{
    foreach (var validationErrors in ex.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}

这将写出导致错误的每个属性。

通过使用Required 属性装饰视图模型属性来强制非空字段,然后这将导致ModelState.IsValid 测试失败并被处理。对于用户无权访问的非空字段,请确保它们具有默认值。

【讨论】:

  • 用户谢谢你,但我该怎么做才能返回视图?
  • @djblois tbh,最好通过使用Required 属性装饰模型属性来强制非空字段,那么这将导致ModelState.IsValid 测试失败。对于用户无权访问的非空字段,请确保它们具有默认值。
  • 用户很抱歉我不在城里。今天回来了,现在看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多