我有一个模特
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);
}
系统返回错误,因为对象用户仅包含已修改的邮件。所有其他属性(即User_id,密码)都消失了。 如何将正确修改的整个对象发送回db?
答案 0 :(得分:0)
要使用实体框架更新内容,您必须先从DB获取实体:
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)
但是,我想你在Session中的某个地方有用户ID。您应该从那里使用它而不是隐藏字段,因为黑客可以更改隐藏标记中的值并编辑其他用户的电子邮件。
答案 1 :(得分:0)
如果您使用mvc的模型绑定,那么您需要将其他属性用作隐藏字段,这样返回整个对象时将返回,而不是仅返回电子邮件。