1

我想有可能使用户更改他的个人资料信息(除了用户ID,用户名和密码(密码在另一个视图改变))在我的方法用户配置的更改不会保存ASP.NET MVC

所以当我使它像

​​

我得到一个错误店更新,插入或删除语句影响的行的意外数字(0)。从那以后,我已经冲浪的计算器,如果有人建议做另一种方式,所以我编辑我的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 Edit方法(HTTPGET获取正确的信息)

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

在我编辑观点我只有LabelFor的和EditorFor的一切(除身份证,用户名和密码),并提交按钮。

试图解决这一整天,还没有成功。

+0

如果您的post方法中的用户对象没有设置Id,则模型绑定将不起作用(即没有任何内容会被更新)。 – dom

+0

因此,我应该传递不是UserProfile对象,而是传递给它的Id,然后找到传递了Id的用户?或者我弄错了? – asdewka

回答

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(大小写无关紧要)的属性。那么你的更新应该可以。但我猜0123,中的主键属性不是Id,而是其他内容 - 如UserId。在这种情况下,模型联编程序无法找到您的密钥属性并将其值保留为默认值(= 0)。

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

+0

谢谢你的提示!另一种方式解决它,但仍然是其中一个问题是失踪的Id .. – asdewka