2016-08-05 1 views
0

私はこのコードを管理者用パネルに使用して、管理者が顧客のパスワードを変更しましたが、エラーは発生しませんでした。パスワードが変更されていないものの、 iはthisChangepasswordAsyncが動作しない

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public virtual ActionResult ChangeUserPassword(SetPasswordViewModel model,string userId) 
    { 
     if (ModelState.IsValid) 
     { 
      //var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); 
      ApplicationUser appUser = db.Users.Find(userId); 
      var result = UserManager.ChangePasswordAsync(appUser, model.NewPassword); 
      if (result.IsCompleted) 
      { 
       var user = UserManager.FindById(User.Identity.GetUserId()); 
       //var user = db.Users.Find(userId); 
       if (user != null) 
       { 
        //await SignInManager<,>.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
       } 
       return RedirectToAction("Index", new { Message = ManageController.ManageMessageId.SetPasswordSuccess }); 
      } 
      // AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

} 

から私の男女共学を持って変更するためのコントローラでこの

public async Task<IdentityResult> ChangePasswordAsync(ApplicationUser Appuser, string newPassword) 
    { 
     var store = this.Store as Microsoft.AspNet.Identity.IUserPasswordStore<ApplicationUser,string>; 
     if (store == null) 
     { 
      var errors = new string[] 
      { 
      "Current UserStore doesn't implement IUserPasswordStore" 
      }; 
      return IdentityResult.Failed(errors); 
      // return Task.FromResult(new IdentityResult(errors) { Succeeded = false }); 

     } 

     var newPasswordHash = this.PasswordHasher.HashPassword(newPassword); 

     await store.SetPasswordHashAsync(Appuser, newPasswordHash); 
     await store.UpdateAsync(Appuser); 

     //return await Task.FromResult<IdentityResult>(IdentityResult.Success); 
     return IdentityResult.Success; 
    } 
} 

いただきました私のミスを使うのか?

更新答えた後、私はこの方法を使用する代わりに

[HttpPost] 
    public async Task<IdentityResult> ChangePasswordAsync(ApplicationUser appuserId, string newPassword) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     //var userr =await db.Users.FirstOrDefaultAsync(x => x.Id == appuserId.Id); 

     var newPasswordHash = this.PasswordHasher.HashPassword(newPassword); 

     db.Entry(Users).State = EntityState.Modified; 
     if (appuserId != null) appuserId.PasswordHash = newPasswordHash; 
     db.SaveChanges(); 
     return IdentityResult.Success; 
    } 

が、IdentityModels.csに再び

同じ問題を抱えていた私は、通常のモデルIdentityModelユーザーに

public DbSet<CommonAction> CommonActions { get; set; } 
    public DbSet<PublicContent> PublicContents { get; set; } 
    public DbSet<MainSubject> MainSubjects { get; set; } 
    public DbSet<EducationLevel> EducationLevels { get; set; } 
    public DbSet<TimePeriod> TimePeriods { get; set; } 
    public DbSet<HelpType> HelpTypes { get; set; } 
    public DbSet<FinancialSupport> FinancialSupports { get; set; } 
    public DbSet<LinksStatistic> LinksStatistics { get; set; } 
    public DbSet<SlideOfCommonAction> SlideOfCommonActions { get; set; } 

を持っ登録されていませんDbSetとして ()

+1

downvoteを詳しく教えてください。 – smoksnes

+0

'db.Entry(Users).State'行の' Users'オブジェクトは何ですか? – smoksnes

+0

これは_ApplicationUser_と同じです。これは 'public DbSet Users {get;セット; } '.iこのエラーが発生しました'型ごとの複数のオブジェクトセットはサポートされていません。オブジェクトセット 'Users'と 'Users'の両方に 'NGO.Models.ApplicationUser'タイプのインスタンスが含まれている可能性があります。 – sunny

答えて

0

あなたはそうではありませんChangePasswordAsyncを待っていて、完了したかどうかを確認しているだけです。これにより、パスワードが変更される前にビューが返されることがあります。

可能であれば、async/awaitの使用を試みてください。つまり、あなたの行動は非同期でなければなりません。コメント後

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public virtual async Task<ActionResult> ChangeUserPassword(SetPasswordViewModel model,string userId) 
    { 
     if (ModelState.IsValid) 
     { 
      //var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); 
      ApplicationUser appUser = db.Users.Find(userId); 

      // await the result. 
      var result = await UserManager.ChangePasswordAsync(appUser, model.NewPassword); 
      if (result.Succeeded) // Or whatever you're expecting. 
      { 
       var user = UserManager.FindById(User.Identity.GetUserId()); 
       //var user = db.Users.Find(userId); 
       if (user != null) 
       { 
        //await SignInManager<,>.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
       } 
       return RedirectToAction("Index", new { Message = ManageController.ManageMessageId.SetPasswordSuccess }); 
      } 
      // AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

}

更新:

エンティティタイプDbSet`1の場合これは

db.Entry(Users).State = EntityState.Modified; 

現在のコンテキストのためにモデルの一部ではありませんEFはコンテキスト内でエンティティにモデルを接続できません。コードを見ることなく、正確に理由を言うのは難しいです。しかし、あなたの文脈ではDbSetが欠落している可能性があります。

UserManagerを正しく設定しましたか?他のUserManagerアクションは機能しますか?

デバッグを試して、クラッシュする箇所を確認してください。

+0

ありがとうございます。パスワードを変更すると、新しいエラーが発生しました – sunny

+0

何のエラーが表示されますか? – smoksnes

+0

"エンティティタイプDbSet'1は、現在のコンテキストのモデルの一部ではありません。 "db.Entry(ユーザー).State = EntityState.Modified;" – sunny