我收到以下错误:值不能为空。参数名称:principal
如何在 Controller 的构造函数中访问身份(userId)?我只能通过将失败的调用包装在函数中(两者都在下面突出显示)来使其工作。
需要注入(inject)什么东西吗?
public class BaseController : Controller {
protected readonly MylDbContext dbContext;
protected readonly string userId;
public BaseController(MylDbContext dbContext) {
this.dbContext = dbContext;
userId = User.GetUserId(); // fails here
}
public string GetUserId() {
return User.GetUserId(); // works here
}
}
最佳答案
正如 @Henk 提到的, Controller 构造函数将在 ActionContext 设置之前执行,因此您将无法访问 Context
、Request
或 用户
。您需要在请求的上下文中检索 userId。
您可以使用 action filters 的老式方法它们仍然是 MVC6 管道的一部分(还通过 IAsyncActionFilter
支持异步操作过滤器)。
由于您想在 Controller 中设置属性,因此实现此操作的最简单方法是重写 Controller 类中的 OnActionExecuting
方法。这是有效的,因为您继承自 Controller
,它已经实现了 IActionFilter
。
public override void OnActionExecuting(ActionExecutingContext context)
{
//Get user id
userId = User.GetUserId();
}
编辑
如果您检查DefaultControllerFactory
你会看到:
- 首先创建 Controller
然后设置 ActionContext(通过属性激活器之一
DefaultControllerPropertyActivator
):var controller = _controllerActivator.Create(actionContext, controllerType); foreach (var propertyActivator in _propertyActivators) { propertyActivator.Activate(actionContext, controller); }
关于asp.net - User.GetUserId() 在 Controller 的构造函数内失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33169060/