如何访问从 PageModel 派生的 class 中的 HTTPContext?

How can I access the HTTPContext in a class derived from PageModel?

为了简化我的 Razor 页面中会话变量的处理,我想在 PageModel 和 IndexModel 之间插入一个单独的 class。

PageModel <- MyPageModel <- IndexModel

现在我注意到在 classes MyPageModel 和 IndexModel 中定义了 HTTPContext 但未设置 (=null)。 但是,如果我直接从 class PageModel 派生 class IndexModel,一切都很好,我可以访问 HTTPContext 和会话变量。 到目前为止,Startup 中的设置都很好,因为其余页面工作正常。 我究竟做错了什么?还是我忽略了什么?

Class 派生自 PageModel 的 MyPageModel

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp.Areas.Ansicht12.Pages
{
    public class MyPageModel : PageModel
    {
        string s1 = default;
        string s2 = default;
        int i3 = 0;

        public MyPageModel() : base()
        {
            s1 = HttpContext.Session.GetString("Var-1");
            s2 = HttpContext.Session.GetString("Var-2");
            i3 = (int)HttpContext.Session.GetInt32("Var-3");
        }

    }
}`

Class 从 MyPageModel 派生的 IndexModel

namespace WebApp.Areas.Ansicht12.Pages
{
    public class IndexModel : MyPageModel
    {
        public IndexModel() : base()
        {
        }

        public void OnGet()
        {
        }
    }
}

调用 Razor 页面的构造函数时,HttpContext 不可用。您可以使用 IHttpContextAccessor 来满足您的要求。

我的页面模型:

public class MyPageModel : PageModel
{
    string s1 = default;
    string s2 = default;
    int i3 = 0;
    public MyPageModel(IHttpContextAccessor httpContextAccessor) :base()    
    {
        s1 = httpContextAccessor.HttpContext.Session.GetString("Var-1");
        s2 = httpContextAccessor.HttpContext.Session.GetString("Var-2");
        i3 = (int)httpContextAccessor.HttpContext.Session.GetInt32("Var-3");
    }            
}

索引模型:

public class IndexModel: MyPageModel
{
    public IndexModel(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
    {
    }

    public void OnGet()
    {
        
    }
}

一定要在Startup.ConfigureServices()方法中注册服务:

services.AddHttpContextAccessor();