1

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

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

    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、用户名和密码除外)和提交按钮。

整天试图解决这个问题,但还没有成功。

4

1 回答 1

2

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

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

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

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

因此,作为隐藏字段的替代方案,您可以为用户的关键属性命名Id或专门UserId用作参数的路由。

于 2012-11-14T20:08:55.850 回答