tutorial net mvc example crear asp and asp.net-mvc asp.net-mvc-5 asp.net-identity-2 actioncontroller

asp.net-mvc - example - login asp.net mvc 5



Accediendo a UserManager fuera de AccountController (4)

Estoy intentando establecer el valor de una columna en la tabla aspnetuser desde un controlador diferente (no el controlador de accountcontroller ). He estado intentando acceder a UserManager pero no puedo entender cómo hacerlo.

Hasta ahora he probado lo siguiente en el controlador en el que quiero usarlo:

ApplicationUser u = UserManager.FindById(User.Identity.GetUserId()); u.IsRegComplete = true; UserManager.Update(u);

Esto no se compilaría (creo que porque UserManager no ha sido instanciado el controlador)

También intenté crear un método público en el AccountController para aceptar el valor al que quiero cambiar el valor y hacerlo allí, pero no puedo averiguar cómo llamarlo.

public void setIsRegComplete(Boolean setValue) { ApplicationUser u = UserManager.FindById(User.Identity.GetUserId()); u.IsRegComplete = setValue; UserManager.Update(u); return; }

¿Cómo accede y edita los datos de usuario fuera del controlador de cuenta?

ACTUALIZAR:

Intenté crear una instancia del UserManager en el otro controlador de la siguiente manera:

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db)); ApplicationUser u = userManager.FindById(User.Identity.GetUserId());

El proyecto cumplió (me emocioné un poco), pero cuando ejecuté el código obtengo el siguiente error:

Additional information: The entity type ApplicationUser is not part of the model for the current context.

ACTUALIZACIÓN 2:

He movido la función a IdentityModel (no preguntes que estoy agarrando a popotes aquí) así:

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; } }

Sin embargo, todavía estoy recibiendo lo siguiente:

The entity type ApplicationUser is not part of the model for the current context.

También hay la siguiente clase en IdentitiesModels.cs:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } }

¿Qué estoy haciendo mal aquí? Se siente como si estuviera ladrando completamente el árbol equivocado. Todo lo que estoy tratando de hacer es actualizar una columna en la tabla aspnetuser desde la acción de un controlador diferente (es decir, no el controlador de cuentas).


Me encontré con este mismo problema y modifiqué mi código para pasar una referencia a la clase UserManager del Controlador al Modelo:

//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; }


Si está utilizando la plantilla de proyecto predeterminada, el UserManager se crea de la siguiente manera:

En el archivo Startup.Auth.cs, hay una línea como esta:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

eso hace que OWIN pipeline cree una instancia de ApplicationUserManager cada vez que llega una solicitud al servidor. Puede obtener esa instancia de la canalización OWIN utilizando el siguiente código dentro de un controlador:

Request.GetOwinContext().GetUserManager<ApplicationUserManager>()

Si observa detenidamente su clase AccountController , verá los siguientes fragmentos de código que hacen posible el acceso al ApplicationUserManager :

private ApplicationUserManager _userManager; public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } }

Tenga en cuenta que, en caso de que necesite crear una instancia de la clase ApplicationUserManager , debe utilizar el método estático ApplicationUserManager.Create para tener la configuración y la configuración adecuadas aplicadas.


Si tiene que obtener la instancia de UserManager en otro controlador, simplemente agregue su parámetro en el constructor del controlador de esta manera

public class MyController : Controller { private readonly UserManager<ApplicationUser> _userManager; public MyController(UserManager<ApplicationUser> userManager) { _userManager = userManager;; } }

¡Pero tengo que obtener UserManager en una clase que no sea controlador!

Cualquier ayuda sería apreciada.

ACTUALIZAR

Estoy considerando que estás usando el núcleo de asp.net


PARA MVC 5

Los pasos para acceder a usermanger o createUser fuera del controlador de cuenta son fáciles. Siga los pasos a continuación

  1. Crear un controlador, considere SuperAdminController
  2. Decora el SuperAdminController igual que el AccountController como se muestra a continuación,

    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; } }

  3. Crear usuario en método de acción

    [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); }