我在 Blazor 中有一個組件,它采用一個引數“TItem”,它可以是任何物件:
員工.razor
@page "/Employees"
<GenericGrid TItem="Employee" MaintainState="true"></GenericGrid>
@code
{
}
上面的組件是 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; }
...
當按鈕被點擊時,我想將用戶發送到另一個頁面。這個頁面應該包含一個表單,用于創建我傳遞給它的任何物件。然而,第一個障礙首先是能夠將物件發送到另一個頁面。路由引數只支持字串和整數之類的東西,所以這不是一個選項。
我發現了以下 StackOverflow 問題:c# blazor how to pass a List to a page。接受的解決方案看起來像一個可行的選擇,但我無法圍繞如何為我的案例實作這一點。
uj5u.com熱心網友回復:
簡短版本:不要。
長版:
Blazor 是 SPA。您不需要將任何東西傳遞給其他任何東西,尤其是在路由引數中。從字面上看,我的整個站點(現在可能有幾百個組件)中唯一必要的導航是在 MVC 腳手架標識系統(我討厭它)和我的主頁之間。
如果您真的需要強制執行頁面分離(盡管您不需要),您應該傳遞某種識別符號——型別的名稱、代表可接受型別的列舉等。
如果您真的真的需要維護一個實際的物件,您可以通過范圍服務或通過級聯到其子級的父頁面(可能是布局頁面)中的變數來實作。 不要做這些。. . 但你可以。:P
uj5u.com熱心網友回復:
簡單的解決方案是使用State. 假設您有 2 個頁面Employees和EmployeeDetail頁面,并且您需要將員工物件從 傳遞Employees到EmployeeDetail。
應用狀態檔案
public class AppState
{
public Employee Employee { get; set; }
}
public class Employee
{
public string Name { get; set; }
}
并且您需要在 program.cs 中將 AppState 注冊為范圍
services.AddScoped<AppState>();
員工.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");
}
}
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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323615.html
上一篇:打字稿-將keyof限制為字串
