Razor Pages中当前会话用户名称无法显示问题排查
问题:Razor Pages中Session存储User模型后Name属性为空
在Razor Pages搭建的登录页面中,使用Session保存登录用户的User模型实例,登录后发现currentUser对象不为空,但Name属性始终为空,仅能显示判断分支中的"works"标签。
相关代码
Index.cshtml.cs
public User currentUser { get; set; } [BindProperty] public string LoginUserName { get; set; } [BindProperty] public string LoginPassword { get; set; } public void OnPostLogin() { currentUser = new(LoginUserName.ToString(), LoginPassword.ToString()); HttpContext.Session.SetObjectsession("currentUser", currentUser); }
Index.cshtml
<form method="post" class="LoginContainer"> <label style="color:grey; font-size:17px; margin-left:20px;">Uživatelské jméno</label> <input name="LoginUserName" class="LoginUsername" type="text"/> <label style="color:grey; font-size:17px; margin-left:20px;">Heslo</label> <input name="LoginPassword" class="LoginPassword" type="text" /> <input type="submit" class="Prihlasit" value="Přihlásit" asp-page-handler="Login"/> @{ var reuslt = HttpContext.Session.GetObjectsession<User>("currentUser"); } @if (reuslt != null) { <h1>@reuslt.Name</h1> <h1>works</h1> } else { <h1>current user is null</h1> }
TestSession.cs
public static class TestSession { //set session public static void SetObjectsession(this ISession session, string key, object value) { session.SetString(key, JsonConvert.SerializeObject(value)); } //get session public static T GetObjectsession<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); } }
解决方案
1. 检查并修正User类定义
Json.NET序列化/反序列化需要User类满足以下条件:
- 属性拥有公共的get和set访问器
- 存在无参构造函数(反序列化必需,除非手动配置序列化选项)
示例正确的User类:
public class User { public string Name { get; set; } public string Password { get; set; } // 无参构造函数,供Json反序列化使用 public User() {} // 带参构造函数,初始化属性 public User(string name, string password) { Name = name; Password = password; } }
2. 移除冗余的ToString()调用
LoginUserName和LoginPassword本身就是string类型,无需额外调用ToString(),直接传入构造函数即可:
currentUser = new User(LoginUserName, LoginPassword);
3. 验证序列化结果(调试用)
在SetObjectsession方法中输出序列化后的JSON字符串,确认Name字段是否被正确序列化:
public static void SetObjectsession(this ISession session, string key, object value) { var json = JsonConvert.SerializeObject(value); // 输出到调试窗口,检查JSON中是否包含Name字段 System.Diagnostics.Debug.WriteLine($"Serialized User: {json}"); session.SetString(key, json); }
4. 确认Session中间件配置正确
在Program.cs中确保已启用Session,且中间件顺序正确:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 中间件顺序:UseRouting之后,UseEndpoints之前 app.UseRouting(); app.UseSession(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
内容的提问来源于stack exchange,提问作者Drapys
相关产品推荐
相关产品推荐

