使用TryUpdateModel使用FormCollection在Edit Post上保存对象

时间:2013-09-06 12:28:09

标签: asp.net-mvc entity-framework

我不确定我是否理解这样做的最佳方法。

如果我有一个包含大量字段的模型,那么我是否必须在TryUpdateModel下的白名单中明确列出每一个字段,或者我可以只传递ForCollection。

以下代码不保存我的编辑,是我逐个列出所有字段的唯一选择吗?

public ActionResult Edit(int id, FormCollection form)
{            
    var jobToUpdate = db.Jobs
        .Include(x => x.JobNotes)
        .Where(x => x.JobID == id)
        .SingleOrDefault();

    if (TryUpdateModel(jobToUpdate, form))
    {

        db.Entry(jobToUpdate).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Details", new { id = model.Job.JobID });
    }
    return RedirectToAction("Details", new { id = model.Job.JobID })
}

其次,获取已更改字段列表的最佳方法是什么。如果用户更改的唯一字段是FirstName字段,我想将其记录在审核日志中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您的模型中的字段不在表单中,并且您不希望用户更改,则可以使用排除列表。使用包含或排除列表的选择将取决于哪个最大。包含列表更安全,就像您忘记包含无法更改的内容一样。不使用包含或排除列表会使您容易受到模型填充的影响,用户可以在其中发布额外的值以更改他们不应该具备的详细信息。

public ActionResult Edit(int id, FormCollection form)
{            
    var jobToUpdate = db.Jobs
        .Include(x => x.JobNotes)
        .Where(x => x.JobID == id)
        .SingleOrDefault();

    if (TryUpdateModel(jobToUpdate, String.Empty, null, new [] {"SecretField"}, form))
    {
        db.SaveChanges();

        return RedirectToAction("Details", new { id = model.Job.JobID });
    }

    // Model not saved - send them back to edit page for corrections
    return View(jobToUpdate);
}

如果未保存模型,则不应重定向。向他们显示相同的页面,并确保您的编辑视图显示模型错误。

您的代码未保存模型的最可能原因是您尝试插入无效的值。

相关问题