我到处都看到(在每个教程中)类似的东西:
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);
}
或者这可能不是必要的,因为数据库不允许保存身份不良的员工?你觉得怎么样?
答案 0 :(得分:2)
实际上没有必要,因为你注意到了;您的代码将导致UPDATE
命令,但如果实体的ID无效,您将收到错误。无需再次显式加载它,用于检查是否存在与id匹配的实体 ...
那就是说,你可能还有其他原因要做。例如,要确保允许登录用户编辑该特定实体。
答案 1 :(得分:1)
我要提前解决的一件事是将实体模型与您的视图分离,这不是一个好习惯。如果您的实体包含敏感数据怎么办?还是复杂的模特?此数据可在浏览器中查看。您可能最终会将其他数据传递到您的视图,最终会发布“胖子”#39;模型,保持它们小而且必要。
使用视图模型,您可以对它们应用验证,以便为您解决问题。当您调用ModelState.IsValid并将它们传递回视图时,将填充这些错误。我使用Fluent Validation而不是默认的默认MVC注释。但检查两个/类似,看看哪个适合你。
通过将验证分离到视图模型中,可以使控制器保持整洁。当然,您需要在数据库中来回映射它们,但它会给您带来很大的灵活性,您可以扩展它们,添加验证等。
答案 2 :(得分:0)
进行理智检查没有任何问题。如果在开发阶段没有什么可以给你一些错误。