我似乎错过了一些明显的东西。我在编辑方法中使用Bind仅更新Bind中列出的字段。但是,所有字段都在更新,并且由于表单中不包含许多字段,这些字段将被覆盖并设置为null。我只想更新Bind中列出的字段。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "customerid,firstname,lastname,businessid,userid")] customers customers)
{
if (ModelState.IsValid)
{
db.Entry(customers).State = EntityState.Modified;
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
...
}
答案 0 :(得分:1)
我的猜测是你没有在表单中包含这些字段。因此,当提交表单时,这些属性值将返回null,模型绑定器使用创建的(通过模型绑定器)customers
对象的空值。保存对象时,空值将保存在这些属性/字段中。
理想情况下,您应该做的是, 在您的HttpPost操作中再次阅读该实体,并仅修改您想要修改的属性 。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "CustomerId,FirstName)]
Customers model)
{
if (ModelState.IsValid)
{
var c = db.Customers.FirstOrDefault(s=>s.CustomerId==model.CustomerId);
if(c!=null)
{
c.FirstName = model.FirstName; //update the property value
db.Entry(c).State = EntityState.Modified;
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
}
}
此外,如果您愿意,可以考虑使用视图模型(特定于您的视图)在操作方法和视图之间传递数据,以更新您的数据,如this answer中所述。
答案 1 :(得分:1)
您可以选择要更新的属性:
if (ModelState.IsValid)
{
db.Customers.Attach(customers);
var entry = db.Entry(customers);
entry.Property(e => e.customerid).IsModified = true;
entry.Property(e => e.firstname).IsModified = true;
...
await db.SaveChangesAsync();
return RedirectToAction("Index");
}