1

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

如果我有一个包含大量字段的模型,那么我是否必须在 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 字段,我想将其记录在审核日志中。

谢谢你的帮助!

4

1 回答 1

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);
}

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

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

于 2013-09-06T12:46:39.797 回答