別のコントローラー(aspnetuser
ではなく)からaccountcontroller
テーブルの列の値を設定しようとしています。私はUserManager
にアクセスしようとしましたが、どうすればよいかわかりません。
これまでのところ、使用したいコントローラーで次のことを試しました。
ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
u.IsRegComplete = true;
UserManager.Update(u);
これはコンパイルされません(UserManager
がコントローラーをインスタンス化していないためだと思います)
また、AccountController
にパブリックメソッドを作成して、値を変更したい値を受け入れてそこで実行しようとしましたが、それを呼び出す方法がわかりません。
public void setIsRegComplete(Boolean setValue)
{
ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
u.IsRegComplete = setValue;
UserManager.Update(u);
return;
}
アカウントコントローラーの外部でユーザーデータにアクセスして編集するにはどうすればよいですか?
更新:
私は他のコントローラーでUserManagerをインスタンス化しようとしました:
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
ApplicationUser u = userManager.FindById(User.Identity.GetUserId());
私はプロジェクトを順守しました(少し興奮しました)が、コードを実行すると次のエラーが表示されます。
Additional information: The entity type ApplicationUser is not part of the model for the current context.
更新2:
次のように、関数をIdentityModelに移動しました(ここでストローを握りしめているとは言わないでください)。
public class ApplicationUser : IdentityUser
{
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 Boolean IsRegComplete { get; set; }
public void SetIsRegComplete(string userId, Boolean valueToSet)
{
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
ApplicationUser u = new ApplicationUser();
u = userManager.FindById(userId);
u.IsRegComplete = valueToSet;
return;
}
}
しかし、私はまだ次を取得しています:
The entity type ApplicationUser is not part of the model for the current context.
IdentitiesModels.csには次のクラスもあります。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
ここで何が間違っていますか?間違ったツリーを完全にbarえているように感じます。私がやろうとしているのは、別のコントローラのアクションからaspnetuserテーブルの列を更新することです(つまり、AccountsControllerではありません)。
デフォルトのプロジェクトテンプレートを使用している場合、UserManager
は次の方法で作成されます。
Startup.Auth.csファイルには、次のような行があります。
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
これにより、サーバーに要求が到着するたびに、OWINパイプラインがApplicationUserManager
のインスタンスをインスタンス化します。コントローラ内で次のコードを使用して、OWINパイプラインからそのインスタンスを取得できます。
Request.GetOwinContext().GetUserManager<ApplicationUserManager>()
AccountController
クラスを注意深く見ると、ApplicationUserManager
へのアクセスを可能にする次のコードが表示されます。
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
ApplicationUserManager
クラスをインスタンス化する必要がある場合、ApplicationUserManager.Create
静的メソッドを使用して、適切な設定と構成を適用する必要があることに注意してください。
別のUserManagerのインスタンスを取得する必要がある場合Controllerコントローラーのコンストラクターにこのパラメーターを追加するだけです。
public class MyController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public MyController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;;
}
}
しかし、コントローラーではないクラスでUserManagerを取得する必要があります!
任意の助けをいただければ幸いです。
[〜#〜] update [〜#〜]
私はあなたがasp.netコアを使用していると考えています
MVC 5の場合
アカウントコントローラーの外部でusermangerまたはcreateUserにアクセスする手順は簡単です。以下の手順に従ってください
以下のように、AccountControllerと同じSuperAdminControllerを飾ります。
private readonly IAdminOrganizationService _organizationService;
private readonly ICommonService _commonService;
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public SuperAdminController()
{
}
public SuperAdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
public SuperAdminController(IAdminOrganizationService organizationService, ICommonService commonService)
{
if (organizationService == null)
throw new ArgumentNullException("organizationService");
if (commonService == null)
throw new ArgumentNullException("commonService");
_organizationService = organizationService;
_commonService = commonService;
}
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
private set
{
_signInManager = value;
}
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
アクションユーザーの作成方法
[HttpPost]
public async Task<ActionResult> AddNewOrganizationAdminUser(UserViewModel userViewModel)
{
if (!ModelState.IsValid)
{
return View(userViewModel);
}
var user = new ApplicationUser { UserName = userViewModel.Email, Email = userViewModel.Email };
var result = await UserManager.CreateAsync(user, userViewModel.Password);
if (result.Succeeded)
{
var model = Mapper.Map<UserViewModel, tblUser>(userViewModel);
var success = _organizationService.AddNewOrganizationAdminUser(model);
return RedirectToAction("OrganizationAdminUsers", "SuperAdmin");
}
AddErrors(result);
return View(userViewModel);
}
この同じ問題にぶつかり、コードを変更して、コントローラーからモデルにUserManagerクラスへの参照を渡しました。
//snippet from Controller
public async Task<JsonResult> UpdateUser(ApplicationUser applicationUser)
{
return Json(await UserIdentityDataAccess.UpdateUser(UserManager, applicationUser));
}
//snippet from Data Model
public static async Task<IdentityResult> UpdateUser(ApplicationUserManager userManager, ApplicationUser applicationUser)
{
applicationUser.UserName = applicationUser.Email;
var result = await userManager.UpdateAsync(applicationUser);
return result;
}