【问题标题】:When dealing with Razor Pages and a Page Model class is the constructor called on each request?在处理 Razor Pages 和 Page Model 类时,每个请求都会调用构造函数吗?
【发布时间】:2020-01-31 03:18:26
【问题描述】:

我一直在努力理解我的 Razor 页面使用的页面模型类的生命周期。我正在尝试考虑如何以及何时处理我传递给我的业务逻辑的常见数据,例如运行请求的 userId。很多时候,我需要将此信息与操作结果一起保存。

那么,哪里是反复处理某些事情的最佳位置,例如从 HTTPContext 获取可能在持久性模型中而不是在页面模型的用户上下文中的用户详细信息?

我应该提到我正在使用带有 cookie 支持的身份验证的授权标签来对 web 服务进行身份验证。

【问题讨论】:

    标签: asp.net-core .net-core razor-pages


    【解决方案1】:

    要从Razor Page以外的其他层访问Reuqest,您可以尝试IHttpContextAccessor

    对于从请求中处理用户详细信息的一般方法,您可以创建如下服务:

    public interface IUserService
    {
        IdentityUser GetUser();
    }
    
    public class UserService:IUserService
    {
        private readonly ApplicationDbContext _context;
        private readonly HttpContext _httpContext;
    
        public UserService(ApplicationDbContext context
            , IHttpContextAccessor httpContextAccessor)
        {
            _context = context;
            _httpContext = httpContextAccessor.HttpContext;
        }
        public IdentityUser GetUser()
        {
            StringValues userId = "";
            if (_httpContext.Request.Headers.TryGetValue("userId", out userId))
            {
                var user = _context.Users.FirstOrDefault(u => u.Id == userId);
                return user;
            }
            else
            {
                return null;
            }
        }
    }
    

    然后像这样注册

        services.AddScoped<IUserService, UserService>();
    

    然后,您可以从 DI 解析 IUserService,以便在您想要访问用户信息时使用它们。

    public class IndexModel : PageModel
    {
        private readonly IUserService _userService;
    
        public IndexModel(IUserService userService)
        {
            _userService = userService;
        }
    
        public void OnGet()
        {
            var user = _userService.GetUser();
        }
    }
    

    【讨论】:

    • 是的,我喜欢这个主意。我仍然觉得有太多的样板代码,我似乎永远不知道该放在哪里!
    • @PaulDuer 您想在哪里访问用户详细信息?
    • 在像 OnPost 这样的请求方法中基本上有很多次,这是我们的 OnPut,我需要获取 httpcontext 用户,然后返回我的系统用户。我想要一种更快的方法来随时准备好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2018-11-21
    • 1970-01-01
    • 2013-08-02
    • 2021-12-15
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多