我不确定我是否理解这样做的最佳方法。
如果我有一个包含大量字段的模型,那么我是否必须在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字段,我想将其记录在审核日志中。
感谢您的帮助!
答案 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);
}
如果未保存模型,则不应重定向。向他们显示相同的页面,并确保您的编辑视图显示模型错误。
您的代码未保存模型的最可能原因是您尝试插入无效的值。