【问题标题】:(ASP.NET Core Razor Pages) Unable to access Session Variables from other pages(ASP.NET Core Razor 页面)无法从其他页面访问会话变量
【发布时间】:2019-04-25 08:39:11
【问题描述】:

我正在尝试访问 Razor Pages 应用程序中的一些会话变量,但遇到了 NullReferenceException 错误。

目前,我在模型中与“用户登录”页面关联的方法中设置变量:

public void StoreUserData(string username, string name, int accesslevel)
    {
        HttpContext.Session.SetString("username", username);
        HttpContext.Session.SetString("name", name);
        HttpContext.Session.SetInt32("accesslevel", accesslevel);
    }

然后当用户在页面上提交登录表单(在帖子上)时,我会调用此方法(以及获取要存储的数据的方法):

public IActionResult OnPost()
    {
        (string username, string name, int accesslevel) = Login();
        StoreUserData(username, name, accesslevel);
        ViewData["username"] = HttpContext.Session.GetString("username");
        return Page();
    }

我知道会话变量正在保存,并且可以访问(至少在“登录”页面上),因为“用户名”字符串使用 ViewData 正确显示在页面上,如上块所示。

当我尝试在另一个 razor 页面中访问相同的会话变量时,它不起作用。

我想在页面加载时检查会话变量。 C#方法(第二页的页面模型的一部分):

public (string username, string name, int accesslevel) GetUserData()
    {
        string username = HttpContext.Session.GetString("username");
        string name = HttpContext.Session.GetString("name");
        int accesslevel = Convert.ToInt32(HttpContext.Session.GetInt32("accesslevel"));

        return (username, name, accesslevel);
    }

并在 html 页面上使用 C# 块来调用此方法(页面加载时我不知道有更好的方法来执行此操作):

@{ 
    Test_1Model model = new Test_1Model();
    (string username, string name, int accesslevel) = model.GetUserData();
    <div>@username</div>
}

目前,我只想在第二页上显示一个会话变量以检查一切是否正常。

最后,在 startup.cs 中: 配置服务:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(10);
        });

        services.AddHttpContextAccessor();

        services.AddMemoryCache();

        services.AddMvc();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);            
    }

配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

我知道这包含很多信息,但我已尽力做到尽可能详尽。非常感谢任何帮助。

【问题讨论】:

    标签: asp.net-core session-variables nullreferenceexception razor-pages session-storage


    【解决方案1】:

    这是由Test_1Model model = new Test_1Model();引起的,您应该使用Model而不是初始化一个新的Test_1Model。对于这个新对象,它与您的请求无关,它只是一个对象。

    试试看。

    @{
         ViewData["Title"] = "Contact";
         //ContactModel model = new ContactModel();
         (string username, string name, int accesslevel) = Model.GetUserData();
         <div>@username</div>
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2021-06-03
      • 2016-06-24
      • 2017-09-11
      相关资源
      最近更新 更多