如何在ASP.NET MVC中保留/保护Edit中的某些字段

Jim*_*Jim 5 asp.net asp.net-mvc entity-framework

在ASP.NET MVC的"编辑"操作中,可以使用HiddenFieldFor向用户隐藏某些字段.但是,这不会保护字段(例如ID,数据创建日期)不被编辑.

例如,模型学生具有字段ID,名称和生日.我想允许用户更新名称,但不是ID或生日.

对于像这样的编辑动作

public ActionResult Edit(Student student)
{
    if (ModelState.IsValid)
    {
        db.Entry(student).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(student);
}
Run Code Online (Sandbox Code Playgroud)

如何防止编辑Id和Birthday?谢谢!

Dar*_*rov 11

您应该使用仅包含要编辑的属性的视图模型:

public class EditStudentViewModel
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public ActionResult Edit(StudentViewModel student)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不建议的另一种技术是从绑定中排除某些属性:

public ActionResult Edit([Bind(Exclude = "Id,Birthday")]Student student)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

或包括:

public ActionResult Edit([Bind(Include = "Name")]Student student)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Jim,是的,你怎么样?真.ASP.NET MVC中最基本的概念解决了所有问题:-)是的,您应该有一个专门为Edit操作设计的视图模型.它应该只包含您感兴趣的属性.然后,您应该在视图模型和模型模型之间进行映射以执行更新.[AutoMapper](http://automapper.org/)对于这项工作来说是一个非常棒的工具. (2认同)
  • @Jim,因为明天你(或团队中的其他一些开发人员)会向域模型添加一个新属性,并且忘记将它添加到控制器动作的`[Bind]`属性中,你会得到非常糟糕的惊喜.它被称为"质量分配"攻击,它基本上设置了数据库中永远不应该设置的字段.如果您的域模型中存在IsAdmin字段=>灾难性,请考虑后果.只需在其中伪造一个带有`IsAdmin = true`的HTTP请求,学生就会成为管理员. (2认同)