C# 如何防止实体框架对象';防止在默认编辑操作中更改属性?
这是MVC 4生成的默认编辑/更新操作:C# 如何防止实体框架对象';防止在默认编辑操作中更改属性?,c#,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,这是MVC 4生成的默认编辑/更新操作: // POST: /User/Edit/5 // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken
// POST: /User/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,FirstName,LastName,EmailAddress,Company")] User user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
我已从“编辑”视图中删除了此处未列出的一些属性:
- 哈希密码
- IsGlobalAdmin
每次保存此表单时,这些值都将变为NULL。我需要更改什么来防止这种情况发生?如果您将它们从视图中删除,它们将被发布为空,而不是使用
Html.HiddenFor()
helper为它们创建隐藏字段,以便它们以隐藏的形式发布,但用户将无法编辑它们:
@Html.HiddenFor(x=>x.HashedPassword)
@Html.HiddenFor(x=>x.IsGlobalAdmin)
实体状态的当前更改将标记所有要更新的列。我将代码更改为:
公共操作结果编辑(用户)
{
if(ModelState.IsValid)
{
User saveUser=新用户{ID=User.ID}
db.Attach(saveUser);
saveUser.FirstName=user.FirstName
saveUser.LastName=user.LastName
saveUser.EmailAddress=user.EmailAddress;
saveUser.Company=user.Company;
db.SaveChanges();
返回操作(“索引”);
}
返回视图(用户);
}
调用
db.Attach(saveUser)
之后对saveUser
的每次更改都会被跟踪以进行更新。(如果用户不在数据库中,则会出现SQL异常。)那么,它们应该变成什么呢?@ChristopherStevenson它们应该保持不变。我不希望这些值在这里是可编辑的。正确的方法是使用ViewModel并在映射到模型时处理属性。有关类似的问题和答案,请参阅。这将使客户可以通过任何其他可用方式看到这些问题和答案(并通过POST
)进行编辑,因为ViewModel确定哪些字段是可编辑的,并且只将这些字段传递回模型。这不是一个简单的改变,但它是最安全的。你能把解决方案作为答案发布吗?不,因为它是这个想法的复制品。在连接主键之前,必须先匹配主键。(因此,ID=User.ID
行)这里有一些关于所有这些的信息。我的意思是,它只会更新我们正在设置的列。空列不会被更新,这就是你的意思??正确。实体框架只跟踪对saveUser
的更改。(这就是附加的意思)