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

标签 asp.net asp.net-core asp.net-core-mvc

我收到以下错误:值不能为空。参数名称: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/

相关文章:

asp.net-core - vNext MVC 模板 - wwwroot

c# - ASP.NET 5 MVC 6 和 Entity Framework 7 问题

javascript - 如何使用 javascript 更改基于另一个下拉列表的下拉列表值?

c# - IIS 7.0 asp.net session 超时

c# - EF7 在实体属性中使用 NotMapped 属性时添加迁移错误

javascript - 当用户浏览应用程序时,在回发中保留 JavaScript setTimeout 函数调用

c# - ASP.NET MVC 6 - 将 NOT NULL 分配给 Entity Framework 7 中的主键

c# - ASP.Net Core MVC - FullCalendar - 事件不显示

c# - 在 ASP.NET C# 中使用不同的参数动态调用另一个 ASP 页面

c# - 在 TreeView 控件中隐藏节点