You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:30:34