gpt4 book ai didi

asp.net - User.GetUserId() 在 Controller 的构造函数内失败

转载 作者:行者123 更新时间:2023-12-03 02:59:13 26 4
gpt4 key购买 nike

我收到以下错误:值不能为空。参数名称: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 设置之前执行,因此您将无法访问 ContextRequest用户。您需要在请求的上下文中检索 userId。

您可以使用 action filters 的老式方法它们仍然是 MVC6 管道的一部分(还通过 IAsyncActionFilter 支持异步操作过滤器)。

由于您想在 Controller 中设置属性,因此实现此操作的最简单方法是重写 Controller 类中的 OnActionExecuting 方法。这是有效的,因为您继承自 Controller ,它已经实现了 IActionFilter

public override void OnActionExecuting(ActionExecutingContext context)
{
//Get user id
userId = User.GetUserId();
}

编辑

如果您检查DefaultControllerFactory你会看到:

  1. 首先创建 Controller
  2. 然后设置 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com