2016-07-22 84 views
1

我試圖創建一個管理部分的帳戶信息可以看到和編輯使用MVC,剃刀和實體框架(代碼優先)的Web應用程序。我的問題是,當我嘗試使用控制器重置密碼時,其餘帳戶信息被刪除。這裏是我的控制器帳戶信息正在從用戶控制器編輯中刪除密碼

// GET: Edit/5 
    public ActionResult Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     ApplicationUser applicationUser = db.Users.Find(id); 
     if (applicationUser == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(applicationUser); 
    } 

    // POST: Edit/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id, EmployeeNumber, FirstName, LastName, Department, Supervisor, Email, UserName, Password, Confirm Password")] ApplicationUser applicationUser) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByNameAsync(applicationUser.Email); 
      applicationUser.SecurityStamp = Guid.NewGuid().ToString("D"); 
      string resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var pass = Request["Password"]; 
      IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(user.Id, resetToken, Request["Password"]); 

      db.Entry(applicationUser).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(applicationUser); 
    } 

當調試和單步調試代碼,並尋找到我看到一個密碼散列和正確保存,直到db.SaveChanges();數據庫,加強了該行後的密碼,然後刪除,但其餘的信息被保存。所以我想,可能會將密碼重設過程移到該行後面,但隨後刪除了編輯的額外信息,同時保存了密碼。所以我似乎無法弄清楚爲什麼會出現這種情況。我發現了其他的帖子,但他們說解決方案是要麼對代碼進行編碼,要麼用'+'替換空格,要麼給它加上時間戳,但是從閱讀這些代碼看來,我正在編寫的重置過程是正確的,在我看來,我在這裏有一些不同的情況。令牌驗證即將取得成功,並且整個過程中仍留有時間戳記。也許有人可以提出一些見解,並告訴我爲什麼我遇到了問題?這將不勝感激!

我正在使用ApplicationUser模型,如下所示。

namespace ReconciliationApp.Models 
{ 
    public class ApplicationUser : IdentityUser 
    { 
     public string EmployeeNumber { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Department { get; set; } 
     public string Supervisor { get; set; } 

     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() : base("ReconciliationContext") 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 

     public System.Data.Entity.DbSet<ReconciliationApp.Models.RegisterViewModel> RegisterViewModels { get; set; } 
    } 
} 

另外讓我知道你是否需要任何可能看起來相關的信息!

+1

'db.Entry(applicationUser).State = EntityState.Modified;'和'db.SaveChanges();'不是必需的。爲什麼你想要更新用戶,如果Asp.NET Identity已經爲你做了這些?如果您需要更改安全印記,則可以調用UserManager.UpdateSecurityStampAsync() - https://msdn.microsoft.com/en-us/library/dn497579%28v=vs.108%29.aspx?f=255&MSPPError = -2147217396) –

+0

這是不正確的,如果你看看我的控制器,我也綁定了其他信息(EmployeeNumber,FirstName,LastName等),並且如果我離開'db,這些信息不會被髮布到數據庫.Entry(applicationUser).State = EntityState.Modified;'和'db.SaveChanges();'出。我甚至試過證實。 – Jand

+0

其實我找到了它,你指着我正確的方向看着我如何寫安全印章,現在看起來很明顯。那謝謝啦! – Jand

回答

0

我想通了,似乎我只是需要單獨設置一切,而不是一次設置所有。我想我只是試圖將這個控制器建立在我擁有和使用的一些腳手架控制器上。這是我的工作代碼。

// POST: CSReconForms/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id, EmployeeNumber, FirstName, LastName, Department, Supervisor, Email, UserName, Password, Confirm Password")] ApplicationUser applicationUser) 
    { 
     if (ModelState.IsValid) 
     { 
      //UserManager.Create<applicationu>(); 
      var user = await UserManager.FindByNameAsync(applicationUser.Email); 
      //applicationUser.SecurityStamp = Guid.NewGuid().ToString("D"); 
      user.EmployeeNumber = applicationUser.EmployeeNumber; 
      user.FirstName = applicationUser.FirstName; 
      user.LastName = applicationUser.LastName; 
      user.Department = applicationUser.Department; 
      user.Supervisor = applicationUser.Supervisor; 

      string resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var pass = Request["Password"]; 
      IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(user.Id, resetToken, Request["Password"]); 

      return RedirectToAction("Index"); 
     } 
     return View(applicationUser); 
    }