我们应该检查POST动作编辑中的ID吗?

时间:2014-07-10 20:17:36

标签: asp.net-mvc

我到处都看到(在每个教程中)类似的东西:

 public ActionResult Edit(int id = 0)
{
    Employee employee = db.Employees.Find(id);
    if (employee == null)
    {
        return HttpNotFound();
    }

    return View(employee);
}

[HttpPost]
public ActionResult Edit(Employee employee)
{
    if (ModelState.IsValid)
    {
        db.Entry(employee).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(employee);
}

因此,在GET操作编辑中,我们检查是否存在id但在POST操作中编辑不。我们不应该在POST动作编辑中检查id吗?我的意思是这样的:

[HttpPost]
public ActionResult Edit(Employee employee)
{
    // Check if employe exists in database:
    Employee employeeFromDB = db.Employees.Find(employee.id);
    if (employeeFromDB == null)
    {
        return HttpNotFound();
    }

    if (ModelState.IsValid)
    {
        db.Entry(employee).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(employee);
}

或者这可能不是必要的,因为数据库不允许保存身份不良的员工?你觉得怎么样?

3 个答案:

答案 0 :(得分:2)

实际上没有必要,因为你注意到了;您的代码将导致UPDATE命令,但如果实体的ID无效,您将收到错误。无需再次显式加载它,用于检查是否存在与id匹配的实体 ...

那就是说,你可能还有其他原因要做。例如,要确保允许登录用户编辑该特定实体。

答案 1 :(得分:1)

我要提前解决的一件事是将实体模型与您的视图分离,这不是一个好习惯。如果您的实体包含敏感数据怎么办?还是复杂的模特?此数据可在浏览器中查看。您可能最终会将其他数据传递到您的视图,最终会发布“胖子”#39;模型,保持它们小而且必要。

使用视图模型,您可以对它们应用验证,以便为您解决问题。当您调用ModelState.IsValid并将它们传递回视图时,将填充这些错误。我使用Fluent Validation而不是默认的默认MVC注释。但检查两个/类似,看看哪个适合你。

通过将验证分离到视图模型中,可以使控制器保持整洁。当然,您需要在数据库中来回映射它们,但它会给您带来很大的灵活性,您可以扩展它们,添加验证等。

答案 2 :(得分:0)

进行理智检查没有任何问题。如果在开发阶段没有什么可以给你一些错误。