(ASP.NET 核心 Razor 页面)无法从其他页面访问会话变量
(ASP.NET Core Razor Pages) Unable to access Session Variables from other pages
我正在尝试访问 Razor Pages 应用程序中的一些会话变量,但遇到了 NullReferenceException 错误。
目前,我在与 "user login" 页面关联的模型中的方法中设置变量:
public void StoreUserData(string username, string name, int accesslevel)
{
HttpContext.Session.SetString("username", username);
HttpContext.Session.SetString("name", name);
HttpContext.Session.SetInt32("accesslevel", accesslevel);
}
然后当用户在页面上提交登录表单时(在 post 上)我调用此方法(以及获取要存储的数据的方法):
public IActionResult OnPost()
{
(string username, string name, int accesslevel) = Login();
StoreUserData(username, name, accesslevel);
ViewData["username"] = HttpContext.Session.GetString("username");
return Page();
}
我知道会话变量正在保存,并且可以访问(至少在"login"页面上),因为"username"字符串在使用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);
}
并且 C# 在 html 页面上阻止调用此方法(我不知道在页面加载时执行此操作的更好方法):
@{
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?}");
});
我知道信息量很大,但我已尽量做到详尽无遗。非常感谢任何帮助。
这是由 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>
}
我正在尝试访问 Razor Pages 应用程序中的一些会话变量,但遇到了 NullReferenceException 错误。
目前,我在与 "user login" 页面关联的模型中的方法中设置变量:
public void StoreUserData(string username, string name, int accesslevel)
{
HttpContext.Session.SetString("username", username);
HttpContext.Session.SetString("name", name);
HttpContext.Session.SetInt32("accesslevel", accesslevel);
}
然后当用户在页面上提交登录表单时(在 post 上)我调用此方法(以及获取要存储的数据的方法):
public IActionResult OnPost()
{
(string username, string name, int accesslevel) = Login();
StoreUserData(username, name, accesslevel);
ViewData["username"] = HttpContext.Session.GetString("username");
return Page();
}
我知道会话变量正在保存,并且可以访问(至少在"login"页面上),因为"username"字符串在使用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);
}
并且 C# 在 html 页面上阻止调用此方法(我不知道在页面加载时执行此操作的更好方法):
@{
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?}");
});
我知道信息量很大,但我已尽量做到详尽无遗。非常感谢任何帮助。
这是由 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>
}