Asp.net mvc 使用TryUpdateModel在编辑文章中使用FormCollection保存对象

Asp.net mvc 使用TryUpdateModel在编辑文章中使用FormCollection保存对象,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我不确定我是否了解这样做的最佳方式 如果我有一个包含大量字段的模型,那么我必须在TryUpdateModel下的白名单中明确列出其中的每一个字段,或者我可以只传递ForCollection 下面的代码不保存我的编辑,这是我唯一可以逐个列出所有字段的方法吗 public ActionResult Edit(int id, FormCollection form) { var jobToUpdate = db.Jobs .Include(x =>

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

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


谢谢你的帮助

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

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);
}
如果未保存模型,则不应重定向。将它们显示在同一页面上,并确保编辑视图显示模型错误


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

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

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);
}
如果未保存模型,则不应重定向。将它们显示在同一页面上,并确保编辑视图显示模型错误

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