从控制器获取和编辑当前经过身份验证的用户
Get and edit currently authenticated user from a controller
我正在构建一个 ASP.NET MVC 应用程序,需要获取和编辑当前登录该应用程序的用户。我使用 IdentityModel 中的构建,并以与此处介绍的类似方式在 AccountController 上编写了几个获取和编辑方法:How to get current user, and how to use User class in MVC5?
AccountController 方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
我的问题是当我尝试从另一个控制器调用它们时,在本例中是从 付款控制器更新 balance
属性:
var currentUser = await Controllers.AccountController.getCurrentUser(User.Identity.GetUserId());
因为 AccountController getCurrentUser 和 editCurrentUser 不是静态的,所以我无法从 class 访问它们。很明显,但是 MVC 应用程序在哪里创建 AccountController 的实例以及如何访问它?
或者,检索和修改当前用户的更好方法?
您不应该从控制器调用 getCurrentUser。
为什么不能直接调用(ApplicationUser)await UserManager.FindByIdAsync(userid);
?
更好的方法 - 将您的方法与用户一起使用特殊 class(服务)并在需要调用此方法的地方引用它。
此处有多种选择。也许对你来说最直接的方法就是制作这些方法,扩展方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
所以创建一个 class 比如:
public static class UserManagerExtensions
{
public static async Task<ApplicationUser> getCurrentUser(this UserManager userManager, string userid)
{
var user = (ApplicationUser)await userManager.FindByIdAsync(userid);
return user;
}
public static async Task<int> editCurrentUser(this UserManager userManager, ApplicationUser user)
{
await userManager.UpdateAsync(user);
return 1;
}
}
然后从每个控制器调用这些扩展方法。这意味着您像在 AccountController 中一样注入 PaymentsController、UserManager 等。
或者,您可以使用 ActionFilters,为帐户、支付控制器或依赖项注入创建一个公共基础 class。
我正在构建一个 ASP.NET MVC 应用程序,需要获取和编辑当前登录该应用程序的用户。我使用 IdentityModel 中的构建,并以与此处介绍的类似方式在 AccountController 上编写了几个获取和编辑方法:How to get current user, and how to use User class in MVC5?
AccountController 方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
我的问题是当我尝试从另一个控制器调用它们时,在本例中是从 付款控制器更新 balance
属性:
var currentUser = await Controllers.AccountController.getCurrentUser(User.Identity.GetUserId());
因为 AccountController getCurrentUser 和 editCurrentUser 不是静态的,所以我无法从 class 访问它们。很明显,但是 MVC 应用程序在哪里创建 AccountController 的实例以及如何访问它?
或者,检索和修改当前用户的更好方法?
您不应该从控制器调用 getCurrentUser。
为什么不能直接调用(ApplicationUser)await UserManager.FindByIdAsync(userid);
?
更好的方法 - 将您的方法与用户一起使用特殊 class(服务)并在需要调用此方法的地方引用它。
此处有多种选择。也许对你来说最直接的方法就是制作这些方法,扩展方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
所以创建一个 class 比如:
public static class UserManagerExtensions
{
public static async Task<ApplicationUser> getCurrentUser(this UserManager userManager, string userid)
{
var user = (ApplicationUser)await userManager.FindByIdAsync(userid);
return user;
}
public static async Task<int> editCurrentUser(this UserManager userManager, ApplicationUser user)
{
await userManager.UpdateAsync(user);
return 1;
}
}
然后从每个控制器调用这些扩展方法。这意味着您像在 AccountController 中一样注入 PaymentsController、UserManager 等。
或者,您可以使用 ActionFilters,为帐户、支付控制器或依赖项注入创建一个公共基础 class。