UserProfile更改不保存ASP.NET MVC

时间:2012-11-14 17:59:56

标签: asp.net asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4

我想让用户可以更改他的个人资料详细信息(UserId,用户名和密码除外(在另一个视图中更改密码))

所以在我的方法中,当我这样做

    public void SaveUser(UserProfile user)
    {
        context.Entry(user).State = System.Data.EntityState.Modified;
        context.SaveChanges();
    }

我收到错误存储更新,插入或删除语句影响了意外的行数(0)。之后我浏览了stackoverflow,有人建议用另一种方式,所以我编辑了我的SaveUser方法

        public void SaveUser(UserProfile user)
     {
        var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter
                   )context).ObjectContext;
        try
        {
            objectContext.SaveChanges();
        }
        catch (OptimisticConcurrencyException)
        {
            objectContext.Refresh(RefreshMode.ClientWins, context.UserProfiles);
            objectContext.SaveChanges();
        }
     }

在这些更改后,我不再收到此错误,但我的个人资料详细信息不会更改。

我的HttpPost编辑方法(HttpGet检索正确的信息)

[HttpPost]
    public ActionResult Edit(UserProfile user)
    {
        if (ModelState.IsValid)
        {
            repository.SaveUser(user);
            return View(user);
        }
        return View();
    }

在我的编辑视图中,我只有LabelFor和EditorFor用于所有内容(Id,用户名和密码除外)和提交按钮。

试图整天解决这个问题但尚未成功。

1 个答案:

答案 0 :(得分:2)

您用户的主键UserId属性值很可能是0,因为您未在视图中使用UserId。然后,您尝试更新数据库中不存在的键值0的实体,并导致异常。

将隐藏的表单字段放入您的视图中,在客户端和服务器之间来回传送用户的UserId

@Html.HiddenFor(model => model.UserId)

通常,如果使用默认路由,则应该有路由http://www.mysite.com/{controller}/{action}/{id}。如果url是http://www.mysite.com/User/Edit/3,MVC会尝试将值3绑定到名为id的属性(大写或小写无关紧要)。您的更新应该工作。但我想User中的主键属性不是Id,而是其他内容 - 例如UserId。在这种情况下,模型绑定器无法找到您的键属性并将其值保留为默认值(= 0)。

因此,作为隐藏字段的替代方法,您可以为用户的密钥属性指定名称Id,或者专门设置使用UserId作为参数的路由。