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

Blazor中如何跨组件获取另一个类的User对象数据?

Blazor组件间用户数据传递问题解决方案

问题根源

你在SecondMain组件里通过new Login()创建的是全新的Login组件实例,和登录时用来填充用户数据的那个实例没有任何关联,所以新实例的user对象自然是未赋值的null。


可行解决方案

方案1:使用Scoped服务共享用户状态(推荐)

这种方式适合组件间实时共享状态,且数据仅在当前会话有效。

  1. 创建用户状态服务类:
public class UserStateService
{
    public User CurrentUser { get; set; }
}
  1. 在Program.cs中注册为Scoped服务:
builder.Services.AddScoped<UserStateService>();
  1. 在Login组件中注入服务并设置用户数据:
@inject UserStateService UserState
@inject NavigationManager NavManager

@code {
    private User user = new User();

    // 登录逻辑示例
    private void HandleLogin()
    {
        user.email = "abc@abc.com";
        user.password = "password";
        // 填充其他属性...

        // 将用户数据存入状态服务
        UserState.CurrentUser = user;
        NavManager.NavigateTo("SecondMain");
    }
}
  1. 在SecondMain组件中注入服务获取用户:
@inject UserStateService UserState

@code {
    protected override void OnInitialized()
    {
        var currentUser = UserState.CurrentUser;
        if (currentUser != null)
        {
            string email = currentUser.email;
            // 后续业务逻辑处理
        }
    }
}

方案2:使用QueryString传递(仅适用于非敏感数据)

⚠️ 注意:密码、手机号这类敏感数据绝对不能用这种方式,会直接暴露在URL中。

  1. Login组件跳转时拼接参数:
// 对特殊字符进行URL编码
var encodedEmail = Uri.EscapeDataString(user.email);
NavManager.NavigateTo($"SecondMain?email={encodedEmail}");
  1. SecondMain组件解析QueryString:
@inject NavigationManager NavManager

@code {
    private string userEmail;

    protected override void OnInitialized()
    {
        var uri = new Uri(NavManager.Uri);
        var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);
        userEmail = queryParams["email"];
    }
}

.NET 6+ 可以用Microsoft.AspNetCore.WebUtilities.QueryHelpers简化参数解析:

var query = QueryHelpers.ParseQuery(NavManager.Uri.Split('?').LastOrDefault());
userEmail = query["email"];

方案3:使用LocalStorage持久化状态(适合记住登录场景)

适合需要持久保存登录状态的场景,但敏感数据必须加密后再存储。

  1. 安装Blazored.LocalStorage包:
Install-Package Blazored.LocalStorage
  1. 在Program.cs注册服务:
builder.Services.AddBlazoredLocalStorage();
  1. Login组件保存用户到LocalStorage:
@inject Blazored.LocalStorage.ILocalStorageService LocalStorage
@inject NavigationManager NavManager

@code {
    private async Task HandleLogin()
    {
        // 填充user对象逻辑...
        
        // 保存到本地存储
        await LocalStorage.SetItemAsync("CurrentUser", user);
        NavManager.NavigateTo("SecondMain");
    }
}
  1. SecondMain组件读取数据:
@inject Blazored.LocalStorage.ILocalStorageService LocalStorage

@code {
    private User currentUser;

    protected override async Task OnInitializedAsync()
    {
        currentUser = await LocalStorage.GetItemAsync<User>("CurrentUser");
        if (currentUser != null)
        {
            // 处理业务逻辑
        }
    }
}

内容的提问来源于stack exchange,提问作者obind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:10:24