Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止实体框架对象';防止在默认编辑操作中更改属性?_C#_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 如何防止实体框架对象';防止在默认编辑操作中更改属性?

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

这是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]
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
的更改。(这就是附加的意思)