从控制器获取并编辑当前身份验证的用户



我正在构建一个ASP。NET MVC应用程序,需要获取和编辑当前登录应用程序的用户。我使用IdentityModel中的构建,并以类似的方式在AccountController上编写了一对get和编辑方法,如下所示:如何获取当前用户,以及如何在MVC5中使用user类?

AccountController methods:

[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不是静态的,我不能从类中访问它们。很明显,但是MVC应用程序在哪里创建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;
}

创建一个类:

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,为Accounts、Payments控制器或依赖注入创建一个公共基类。

你不应该从控制器调用getCurrentUser。为什么不能直接呼叫(ApplicationUser)await UserManager.FindByIdAsync(userid); ?更好的方法是把你的方法放在一个特殊的类(服务)中,当你需要调用这些方法时引用它。

相关内容

  • 没有找到相关文章

最新更新