Entity framework 将部分数据从模型保存到db MVC4
我有一个模型Entity framework 将部分数据从模型保存到db MVC4,entity-framework,asp.net-mvc-4,model,Entity Framework,Asp.net Mvc 4,Model,我有一个模型 public partial class User { public int user_id { get; set; } public virtual string username { get; set; } public string password { get; set; } public string salt { get; set; } public string email { get; set; } public sb
public partial class User
{
public int user_id { get; set; }
public virtual string username { get; set; }
public string password { get; set; }
public string salt { get; set; }
public string email { get; set; }
public sbyte status { get; set; }
public System.DateTime creation_date { get; set; }
}
我想让用户能够从页面更改邮件
所以我创建了我的控制器
[Authorize]
[HttpGet]
public ActionResult Setup()
{
//retrieve the object user
return View(CustomDbFunctions.GetUserEntity(User, db));
}
那么在我看来,
@Html.EditorFor(u => u.email)
但是当我使用
[HttpPost]
public ActionResult Setup(User user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = System.Data.EntityState.Modified;
db.SaveChanges();
return Redirect("Index");
}
return View(user);
}
系统返回一个错误,因为对象用户只包含修改过的邮件。所有其他属性(即用户id、密码)均已消失。
如何将正确修改的整个对象发送回数据库?要使用实体框架更新某些内容,必须首先从数据库获取实体:
if (ModelState.IsValid)
{
var existingUser = db.Users.FirstOrDefault(u => u.user_id == user.user_id);
existingUser.email = user.email;
db.SaveChanges();
return Redirect("Index");
}
为了让它起作用,你还需要在你的视图中,在表单内部,有类似
@Html.HiddenFor(u => u.user_id)
但是,我假设您在会话中的某个位置有用户Id。你应该从那里而不是从隐藏字段使用它,因为黑客可以更改隐藏标记中的值并编辑其他用户的电子邮件。如果你使用mvc的模型绑定,那么你需要使用其他属性作为隐藏字段,这样,在发回时,将返回整个对象,而不是仅返回电子邮件。他只想允许修改电子邮件。如果所有字段都在隐藏字段中,那么用户可以手动编辑隐藏字段并编辑用户对象中的所有内容。为了能够进行任何类型的编辑,他至少需要将Id保留为隐藏字段,这使得整个情况不那么安全。我认为公开所有需要公开主键的字段没有问题。您不想直接从用户输入中保存数据,如Salt、Status或Username。Id是必需的,他所能做的最糟糕的事情就是更改Id并为其他用户更新电子邮件。但是,登录后该Id应保存到会话中,并在本例中从会话中使用,而不是传递到隐藏字段。或db.Users.Finduser.user_Id;