AuthorizeView 和 AuthorizedRouteView 組件中有一個名為“context”的 AuthenticationState 型別的物件。該物件允許通過 context.User 訪問 ClaimsPrincipal。
我可以在源代碼中看到 AuthenticationState 作為 Task 由在 CascadingAuthenticationState 組件中實作的 CascadingValue 組件傳遞給這些組件(該組件又在 App.razor 中的組件層次結構的頂部定義)。
但是,當我檢查 AuthorizeRouteView 的源時,我可以看到名為 ExistingCascadedAuthenticationState 的 Task 型別的級聯引數。然而,對我來說,任務如何以及在哪里被解開并作為“背景關系”公開,這完全是個謎。有人知道答案嗎?
uj5u.com熱心網友回復:
enet 的評論幫助我找到了答案。
當我們有一個RenderFragment<TValue>委托時,<TValue>默認情況下公開為@context.
例如,在AuthorizeRouteView我們有一個引數NotAuthorized:
[Parameter]
public RenderFragment<AuthenticationState> NotAuthorized { get; set; }
在這種情況下AuthenticationState是TValue,因此AuthenticationState暴露為@context。
這篇關于 Blazor 大學的文章是我理解這個概念的關鍵:將占位符傳遞給 RenderFragments。
uj5u.com熱心網友回復:
你需要深入挖掘,它有點復雜。
AuthorizeView繼承自AuthorizeViewCoreAuthorizedRouteView構建它自己的AuthorizeRouteViewCore繼承自AuthorizeViewCore.
底部的代碼AuthorizedRouteView:
private sealed class AuthorizeRouteViewCore : AuthorizeViewCore
{
[Parameter]
public RouteData RouteData { get; set; } = default!;
protected override IAuthorizeData[]? GetAuthorizeData()
=> AttributeAuthorizeDataCache.GetAuthorizeDataForType(RouteData.PageType);
}
AuthorizedRouteView將任何級聯捕獲到ExistingCascadedAuthenticationState. 如果一個存在(不為空)則CascadingAuthenticationState存在于 中App,因此無需再執行任何操作。如果它為空,則它CascadingAuthenticationState作為組件根組件添加到其渲染片段中。這保證Task<AuthenticationState>是級聯的。
AuthorizeViewCore 捕獲級聯值:
[CascadingParameter] private Task<AuthenticationState>? AuthenticationState { get; set; }
它被“解開” OnParametersSetAsync
currentAuthenticationState = await AuthenticationState;
isAuthorized = await IsAuthorizedAsync(currentAuthenticationState.User);
并用于BuildRenderTree您看到的“背景關系”。
var authorized = Authorized ?? ChildContent;
builder.AddContent(0, authorized?.Invoke(currentAuthenticationState!));
內容來自:
[Parameter] public RenderFragment<AuthenticationState>? Authorized { get; set; }
uj5u.com熱心網友回復:
級聯引數是Task<AuthenticationState> context
which 告訴您context,當等待時,將回傳 AuthenticationState 型別的物件。所以你得到的是一個任務。等待任務時,回傳任務回傳的值。訪問用戶的實際語法是
var state = await context;
var user = state.User;
此外,您可以為級聯引數指定任何名稱。所以
[CascadingParameter]
public Task<AuthenticationState> AuthState {get;set;}
var state = await AuthState;
var user = state.User;
同樣有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322258.html
標籤:asp.net核心 西装外套 blazor-webassembly
上一篇:在構造2引擎中獲取異步值
