如何在继承自PageModel的自定义派生类中访问HttpContext?
问题原因
你遇到的HttpContext为null的核心问题是访问时机错误,和你加了中间继承类MyPageModel没有关系。
ASP.NET Core中PageModel实例构造完成时,HttpContext还未被框架注入赋值,不管继承层次如何,在构造函数中直接访问HttpContext都必然得到null。你之前直接继承PageModel时能正常访问,是因为你是在OnGet/OnPost等页面处理方法中访问的,此时HttpContext已经完成赋值。
解决方案
把会话变量读取的逻辑从构造函数转移到页面处理方法执行前的生命周期钩子中即可,推荐重写OnPageHandlerSelected方法,这个方法在HttpContext赋值完成后、具体的OnGet/OnPost执行前触发,非常适合做公共初始化逻辑。
修改后的MyPageModel参考代码:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.RazorPages; namespace WebApp.Areas.Ansicht12.Pages { public class MyPageModel : PageModel { // 调整为protected方便子类访问,可根据需求修改访问级别 protected string s1 = default; protected string s2 = default; protected int i3 = 0; public override void OnPageHandlerSelected(PageHandlerSelectedContext context) { base.OnPageHandlerSelected(context); // 此时HttpContext已经完成赋值,可以安全访问,增加空判断避免会话未初始化报错 if (HttpContext?.Session != null) { s1 = HttpContext.Session.GetString("Var-1"); s2 = HttpContext.Session.GetString("Var-2"); i3 = HttpContext.Session.GetInt32("Var-3") ?? 0; } } } }
IndexModel无需修改,即可正常使用父类初始化的会话变量,也可以在自身的OnGet等方法中正常访问HttpContext。
内容的提问来源于stack exchange,提问作者Casi
相关产品推荐
相关产品推荐

