从控制器

时间:2015-08-13 23:09:57

标签: c# asp.net-mvc authentication instance asp.net-identity

我正在构建一个ASP.NET MVC应用程序,需要获取并编辑登录应用程序的当前用户。我使用IdentityModel中的构建,并在AccountController上以与此处所示类似的方式编写了几个get和edit方法: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不是静态的我无法从类中访问它们。很明显,但MVC应用程序在哪里创建AccountController的实例以及如何访问它?

或者,更好的方法是检索和修改当前用户?

2 个答案:

答案 0 :(得分:1)

这里有一系列选择。也许最直接的方法是制作这些方法,扩展方法:

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

然后从每个控制器调用这些扩展方法。这意味着你注入PaymentsController,UserManager等就像在AccountController中一样。

或者,您可以使用ActionFilters,为Accounts,Payments控制器或依赖注入创建公共基类。

答案 1 :(得分:0)

你不应该从控制器调用getCurrentUser。 为什么不能直接致电(ApplicationUser)await UserManager.FindByIdAsync(userid);? 更好的方法 - 将您的方法与特殊类(服务)中的用户一起使用,并在placec中引用它,您需要调用此方法。