我在我的MVC应用程序中使用Asp.Net身份。我可以看到它有自己的ApplicationDbContext - 虽然它连接到我在其他地方使用的我自己的DbContext所在的同一个SQL数据库。
所以我试图通过AccountController中我自己的代码访问我自己的一些数据 - 它似乎不起作用我认为是因为它认为哪个DBContext是活动的混淆?
我的代码:
public class AccountController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
private PostageManager postmgr;
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, PostageManager _postmgr)
{
UserManager = userManager;
SignInManager = signInManager;
postmgr = _postmgr;
}
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: /Account/Register
[AllowAnonymous]
public ActionResult Register()
{
//create select list items for countries drop down
List<SelectListItem> countries;
countries = postmgr.GetCountries().Select(item => new SelectListItem
{
Value = item.Country,
Text = item.Country
}).ToList();
countries.Insert(0, new SelectListItem { Value = string.Empty, Text = "Select delivery country or region...", Selected = true });
RegisterViewModel mode = new RegisterViewModel
{
Countries = countries
};
return View();
}
}
}
PostageManager只是一个位于我的DAL上以获取某些数据(使用存储库模式)的类 - 我只是使用一种传递方法来获取国家/地区列表,并以完全相同的方式使用它我有其他控制器工作正常。该类下面是我的存储库代码,它链接到我的默认连接字符串(DBContext)。它使用空引用异常在下一行中徘徊,我认为postmgr为null:
countries = postmgr.GetCountries().Select(item => new SelectListItem
相反,为了访问我自己的控制器中的身份数据,我已经完成了以下工作:
public BasketController(BasketManager _mgr, PostageManager _postmgr, ProductManager _prodmgr)
{
mgr = _mgr;
postmgr = _postmgr;
prodmgr = _prodmgr;
shopper = Cart.GetShopperId();
this.applicationDbContext = new ApplicationDbContext();
this.userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.applicationDbContext));
}
protected ApplicationDbContext applicationDbContext { get; set; }
protected UserManager<ApplicationUser> userManager { get; set; }
据我所知,它指出身份代码使用正确的DbContext - 我在我的AccountController中反过来看这个,但无法理解它。
我基本上只是希望能够使用我自己的代码从Identity控制器中获取我自己的数据,以帮助将额外的数据传递到视图。
答案 0 :(得分:0)
我可能错了,但很可能postmgr字段没有从构造函数初始化,这就是为什么你有这个错误。 说明:
默认情况下,Asp将尝试通过不带参数的构造函数创建控制器实例。如果Asp找不到没有参数的构造函数,它将尝试使用参数调用构造函数,但为了使您可以在应用程序中配置IoC。由于您的控制器具有不带参数的构造函数,因此将由Asp选择。所以所有3个字段都是空的。
但是在属性SignInManager和UserManager中,您尝试从字段或OwinContext中获取值。当字段为空时,您的代码将从OwinContext中获取值。 OwinContext是一个非常复杂和智能的工具,可以根据Startup.Auth.cs文件或App_Start文件夹下的任何其他文件中提供的配置自动创建其上下文。
答案 1 :(得分:0)
我想我已经弄明白了 - 将以下内容添加到我的NinjectControllerFactory中:
ninjectKernel.Bind<IAuthenticationManager>().ToMethod(c => HttpContext.Current.GetOwinContext().Authentication); //.InRequestScope();
ninjectKernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>();
ninjectKernel.Bind<UserManager<ApplicationUser>>().ToSelf();
ninjectKernel.Bind<IRoleStore<IdentityRole, string>>().To<RoleStore<IdentityRole, string, IdentityUserRole>>();
ninjectKernel.Bind<RoleManager<IdentityRole>>().ToSelf();
并将我的构造函数更改为:
public AccountController(PostageManager _postmgr)
{
postmgr = _postmgr;
}