绑定不按预期工作

时间:2016-01-04 16:33:03

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

我似乎错过了一些明显的东西。我在编辑方法中使用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");
        }
...
    }

2 个答案:

答案 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");
}