我想让用户可以更改他的个人资料详细信息(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,用户名和密码除外)和提交按钮。
试图整天解决这个问题但尚未成功。
答案 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
作为参数的路由。