我是C#的新手,但基本上我们有一个产品表,其中包含来自其他表的许多外键,如供应商,品牌,制造商等。
基本上,我有一个表单,我希望用户能够在同一个屏幕上更新许多产品。
我的目标是真正更新几个字段,而不是更新表中的所有字段。
因此,例如,一个页面中包含10个产品的列表,每个产品都是一个表单,通过ajax提交。一切正常,直到更新。以下是我的内容:
if (ModelState.IsValid)
{
//db.Entry(product).State = EntityState.Modified;
db.products.Attach(product);
var entry = db.Entry(product);
entry.Property(e => e.featured).IsModified = true;
try
{
db.SaveChanges();
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Debug.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)
{
Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
}
然后,我有一个例外“实体类型”产品“处于状态”修改后的“具有以下验证错误:”并列出所有必填字段,如supplier_id,brand_id等。
我觉得我很亲密,但无法理解。被困了近一个星期了。
非常感谢任何帮助。
感谢。
答案 0 :(得分:0)
我有一个例外“类型的实体”产品“处于”状态“已修改” 有以下验证错误:“并列出所有必需的 像supplier_id,brand_id等字段。
由于此错误会在您尝试db2.SaveChanges();
时提示某些字段未提供,因此可能会null
。尝试检查对象的属性,以确保填充所有必需的内容或至少为空。
同样,评论建议您确保将更改保存到您更改的内容上,因此如果您对db
进行了更改,则SaveChanges()
更改为db
答案 1 :(得分:0)
当您尝试保存更改时,您将丢失有关POST操作的信息。 这是因为您可能在视图表单中没有来自实体的某些属性,因此控制器不知道它的值。 这一切都发生,因为MVC是无国籍的。
最简单的方法是为所有其他不可编辑的属性添加隐藏字段。
@Html.HiddenFor(model => model.Id)
这些字段将包含在POST中,因此,模型绑定器将正确地将它们放入您的实体实例中。
但最佳解决方案是使用视图模型 - 简单的POCO类,它们将成为您视图的模型。不建议直接使用实体模型。 使用视图模型时,您:
因此,当您想显示某些内容时,请将此信息从实体复制到视图模型。在save方法中,您可以使用oposite方式执行此操作,仅更新实体上已更改的属性。
以下是一些信息: http://stephenwalther.com/archive/2009/04/13/asp-net-mvc-tip-50-ndash-create-view-models.aspx