C# 在新控制器中访问ApplicationUserManager和ApplicationSigningManager
我正在尝试在ASP.NET MVC 5中的新控制器中访问C# 在新控制器中访问ApplicationUserManager和ApplicationSigningManager,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我正在尝试在ASP.NET MVC 5中的新控制器中访问ApplicationUserManager和ApplicationSignInManager。我读过很多类似的帖子,但看不出我做错了什么 1.添加新控制器(MVC 5控制器为空) 2.添加类似于AccountController和ManagerController的构造函数以传递ApplicationUserManager和ApplicationSigningManager 示例控制器如下所示 using System; using Sy
ApplicationUserManager
和ApplicationSignInManager
。我读过很多类似的帖子,但看不出我做错了什么
1.添加新控制器(MVC 5控制器为空)
2.添加类似于AccountController和ManagerController的构造函数以传递ApplicationUserManager
和ApplicationSigningManager
示例控制器如下所示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
namespace IR.Controllers
{
[Authorize(Roles = "Administrator")]
public class AdminController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public AdminController()
{
}
public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
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;
}
}
// GET: Default
public ActionResult Index()
{
var user = _userManager.FindByNameAsync("email@email.com");
return View();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用Microsoft.AspNet.Identity;
使用Microsoft.AspNet.Identity.Owin;
使用Microsoft.Owin.Security;
命名空间IR.Controller
{
[授权(角色=“管理员”)]
公共类AdminController:Controller
{
专用应用程序signInManager\u signInManager;
私有应用程序用户管理器\u用户管理器;
公共行政总监()
{
}
公共管理员控制器(ApplicationUserManager用户管理器、ApplicationSignInManager signInManager)
{
UserManager=UserManager;
SignInManager=SignInManager;
}
公共应用程序SignInManager SignInManager
{
得到
{
return _signInManager??HttpContext.GetOwinContext().Get();
}
专用设备
{
_signInManager=值;
}
}
公共应用程序管理员用户管理器
{
得到
{
返回_userManager??HttpContext.GetOwinContext().GetUserManager();
}
专用设备
{
_userManager=value;
}
}
//获取:默认值
公共行动结果索引()
{
var user=\u userManager.FindByNameAsync(“email@email.com");
返回视图();
}
}
}
但是,只调用空构造函数,var user=\u userManager.FindByNameAsync(“email@email.com");代码>失败,因为\u userManager==null
我遗漏了什么?我现在意识到这是一个老问题,但对于那些带着同样问题来到这里的人,这里有一个答案
上面管理者的代码是MVC5模板的标准实现代码,用于带有单个用户帐户的项目集。这两个管理器的实现方式相同,因此我们将继续关注这里讨论的applicationsermanager
,但它也适用于applicationSigningManager
ApplicationUserManager
被实现为具有私有支持字段的公共属性-private ApplicationUserManager\u userManager代码>
backing字段用于保存属性的状态,因此不用于直接在调用代码中使用。这就是公共属性UserManager
的用途。
那么,如何将此属性设置为返回ApplicationUserManager
类的实例而不是null
有两种解决方案。一种是通过重载构造函数实例化AdminController
类:
public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
但我会说,只有在一些边缘情况下,你才会这么做。在大多数情况下,控制器类由http请求实例化。实际上可以删除此构造函数,因为该解决方案已在属性的getter中实现:
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
此行将ApplicationUserManager
存储在文本中
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
因此,上述问题的答案是,使用UserManager-而不是UserManager
var user = UserManager.FindByNameAsync("email@email.com");
我现在意识到这是一个老问题,但对于那些带着同样问题来到这里的人,这里有一个答案
上面管理者的代码是MVC5模板的标准实现代码,用于带有单个用户帐户的项目集。这两个管理器的实现方式相同,因此我们将继续关注这里讨论的applicationsermanager
,但它也适用于applicationSigningManager
ApplicationUserManager
被实现为具有私有支持字段的公共属性-private ApplicationUserManager\u userManager代码>
backing字段用于保存属性的状态,因此不用于直接在调用代码中使用。这就是公共属性UserManager
的用途。
那么,如何将此属性设置为返回ApplicationUserManager
类的实例而不是null
有两种解决方案。一种是通过重载构造函数实例化AdminController
类:
public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
但我会说,只有在一些边缘情况下,你才会这么做。在大多数情况下,控制器类由http请求实例化。实际上可以删除此构造函数,因为该解决方案已在属性的getter中实现:
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
此行将ApplicationUserManager
存储在文本中
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
因此,上述问题的答案是,使用UserManager-而不是UserManager
var user = UserManager.FindByNameAsync("email@email.com");