将部分数据从模型保存到db MVC4

时间:2014-01-12 16:42:23

标签: 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 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?

2 个答案:

答案 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的模型绑定,那么您需要将其他属性用作隐藏字段,这样返回整个对象时将返回,而不是仅返回电子邮件。