如何将通用对象传递到 Blazor 中的另一个页面?

Ste*_*ers 1 generics razor blazor

我在 Blazor 中有一个组件,它采用参数“TItem”,该参数可以是任何对象:

员工.razor

@page "/Employees"

<GenericGrid TItem="Employee" MaintainState="true"></GenericGrid>

@code
{
  
}
Run Code Online (Sandbox Code Playgroud)

上面的组件是 Telerik 网格组件的包装器。这样,我可以使用相同的网格组件来显示来自不同对象的数据,具体取决于我传递给它的对象(员工、客户等)

GenericGrid.razor(仅显示相关代码)

@typeparam TItem

...grid layout...
<GridToolBar>
       <GridCommandButton Icon="add">New @typeof(TItem).Name</GridCommandButton>
</GridToolBar>
...rest of grid layout...

@code {
    ...

    [Parameter]
    public TItem Entity { get; set; }

    ...
Run Code Online (Sandbox Code Playgroud)

单击按钮时,我想将用户发送到另一个页面。该页面应该包含一个表单,用于创建我传递给它的任何对象。然而,第一个障碍是首先能够将对象发送到另一个页面。路由参数仅支持字符串和整数等内容,因此这不是一个选项。

我发现了以下 StackOverflow 问题:c# blazor how to pass a List to a page。接受的解决方案看起来像是一个可行的选择,但我无法思考如何为我的案例实现这一点。

The*_*ker 8

简单的解决方案是使用State. 假设您有 2 个页面Employees&EmployeeDetail多个页面,并且您需要将员工对象从 传递EmployeesEmployeeDetail

应用程序状态.cs

public class AppState
{   
    public Employee Employee { get; set; }
}

public class Employee
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且您需要将 AppState 注册为您的 program.cs 中的范围

services.AddScoped<AppState>();
Run Code Online (Sandbox Code Playgroud)

员工.razor

@page "/employees"
@inject AppState AppState
@inject NavigationManager NavigationManager

<button @onclick="NavigateToEmployeeDetail">Send Employee</button>

@code{
    private void NavigateToEmployeeDetail()
    {
        //set the employee object before navigating
        AppState.Employee = new Employee { Name = "Employee1" };
        NavigationManager.NavigateTo("/employeedetail");
    }
}
Run Code Online (Sandbox Code Playgroud)

EmployeeDetail.razor

@page "/employeedetail"

@inject AppState AppState

<h1>Employee Name :  @EmployeeName</h1>

@code{
    public string EmployeeName { get; set; }
    protected override void OnInitialized()
    {
        if (AppState.Employee is null) return;
        EmployeeName = AppState.Employee.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所需要的。其他人只是简单地说使用本地/会话存储,但在我的情况下却不能,因为一个大对象与会话存储不符。谢谢你! (2认同)