仅编辑某些字段,“SaveChanges”使用默认值填充缺少的字段

时间:2013-03-03 03:18:58

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个模型类,

public class MyModel 
{ 
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
    public DateTime D { get; set; }
}

在编辑屏幕中,我只需编辑`A和B.以下内容将使用默认值(0和'0001-01-01'覆盖C和D。如何保留现有值(在数据库中)表)C和D除了在视图中包含它们并隐藏它们吗?

[HttpPost]
public ActionResult Edit(MyModel myModel)
{
    if (ModelState.IsValid)
    {
        _db_Entry(myModel).State = EntityState.Modified;
        _db.SaveChanges();
    }
    return View(myModel);
}

3 个答案:

答案 0 :(得分:1)

我不确定你的模型究竟是什么样的,但在你的控制器中,我通常会这样做:

[HttpPost]
public ActionResult Edit(MyModel myModel)
{
    if (ModelState.IsValid)
    {
        var existEntry = _db.YourEntity.firstOrDefault(o => A == o.A);
        if(existEntry != null){
          existEntry.A = myModel.A;
          existEntry.B = myModel.B;
          _db.SaveChanges();
        }        
    }
    return View(myModel);
}

当然,这实际上取决于您获取现有条目的模型细节,也许您不喜欢这种方法,在这种情况下,其他答案可能更适合您的需求。

编辑:基本上,我通常处理这个问题的方法是从db获取现有对象,更新它,然后提交更改,从而仅更新您关注的属性,并将其余部分保留原样。

答案 1 :(得分:0)

制作具有A和B属性的视图模型。

public class ViewModel 
{
  public int A {get;set;}
  public int B {get;set;}
}

然后将其作为控制器中的参数,然后将其映射到模型类。

答案 2 :(得分:0)

您可以使用UpdateModel(或TryUpdateModel)。它更新现有实体,但仅限于它可以在值提供程序中找到的属性;其他财产保持不变。

通常你会像这样使用它:

[HttpPost]
public ActionResult Edit(int id, TModel model, string returnUrl)
{
    // Invalid model; redisplay view
    if (!ModelState.IsValid) return View();

    var entity = db.Entity.Find(id);

    // Entity not found; return 404
    if (entity == null) return HttpNotFound();

    // Everything OK; update entity and redirect back
    UpdateModel(entity);
    db.SaveChanges();
    return Redirect(returnUrl);
}