【问题标题】:How to get current user's data in Controller's constructor?如何在 Controller 的构造函数中获取当前用户的数据?
【发布时间】:2017-10-12 11:55:45
【问题描述】:

我需要在控制器的构造函数中使用一些当前用户的数据来初始化存储库,但看起来不可能获取当前用户的数据,因为所有对象都可以提供有关用户的任何数据(例如 HttpContextUser ) 在构造函数的区域中可以为空。如何在构造函数中获取所需数据或以任何其他方式使用用户数据初始化存储库?

【问题讨论】:

  • 为什么在 constructor 中需要它?您不需要在构造函数中初始化存储库,您可以在操作中这样做。你不需要知道用户连接到数据库,你只需要 id 将其作为参数传递给查询
  • 这是针对 asp.net 5 还是针对 asp.net core?
  • @Panagiotis Kanavos 1. 问题是,Web 应用程序已经编写好了,我只是尝试改进它。例如,其中一个控制器可能有 100 多个操作,并且在每种方法中创建所有 17 个存储库是困难且不正确的。 2.但是在构造函数中连ID都不可用(如果我弄错了,告诉我在哪里)。
  • @jao asp.net core 1.1,但我记得同样的问题(用户数据不可用)也存在于经典的 asp.net mvc 中(至少在第 4 个版本中)
  • 那你有一个设计问题,误解了控制器和存储库是关于什么的。构造函数在控制器被构造时被调用。它还没有成为管道的一部分。不正确的是在没有请求使用的情况下尝试获取 request 数据。具有 100 个动作的控制器不是。将 50-100 个控制器放入一个源文件中。

标签: c# asp.net-mvc asp.net-core-mvc asp.net-identity


【解决方案1】:

您可以在构造函数中使用IHttpContextAccessor 访问HttpContext

public class HomeController : Controller
{
    public HomeController(IHttpContextAccessor httpContextAccessor)
    {
        var httpContext = httpContextAccessor.HttpContext;
    }
}

如果您在启动类的配置方法中使用 ASP.NET Core 1.x 注册 IHttpContextAccessor,对于 ASP.NET Core 2.0,我认为不需要。

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

【讨论】:

    【解决方案2】:

    为什么在构造函数中?

    在MVC中获取当前用户的数据有四种方式:

    1. 您可以为当前用户的数据创建会话(首选)
    2. 您可以将数据存储在本地存储中。
    3. 使用 cookie。但这取决于用户浏览器中是否允许使用 cookie。
    4. MVC 提供 ViewBag。您可以使用它传递数据。

    【讨论】:

    • 我不建议将用户数据放在 cookie 中。听起来不太安全。
    • 是的,我也是。但我只展示了传递用户数据的方式。 @jao
    • 登录时使用会话放置一些数据 - 这可能是一个解决方案。谢谢你的好建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2022-06-10
    • 2021-07-12
    相关资源
    最近更新 更多