@@ -42,6 +42,8 @@ static readonly IReadOnlyDictionary<string, object> _emptyParametersDictionary
4242
4343 private bool _onNavigateCalled ;
4444
45+ internal const string AllowRenderDuringPendingNavigationKey = "__BlazorAllowRenderDuringPendingNavigation" ;
46+
4547 [ Inject ] private NavigationManager NavigationManager { get ; set ; }
4648
4749 [ Inject ] private INavigationInterception NavigationInterception { get ; set ; }
@@ -220,11 +222,14 @@ private void ClearRouteCaches()
220222
221223 internal virtual void Refresh ( bool isNavigationIntercepted )
222224 {
225+ var providerRouteData = RoutingStateProvider ? . RouteData ;
226+ var allowRenderDuringPendingNavigation = TryConsumeAllowRenderDuringPendingNavigation ( providerRouteData ) ;
227+
223228 // If an `OnNavigateAsync` task is currently in progress, then wait
224229 // for it to complete before rendering. Note: because _previousOnNavigateTask
225230 // is initialized to a CompletedTask on initialization, this will still
226231 // allow first-render to complete successfully.
227- if ( _previousOnNavigateTask . Status != TaskStatus . RanToCompletion )
232+ if ( _previousOnNavigateTask . Status != TaskStatus . RanToCompletion && ! allowRenderDuringPendingNavigation )
228233 {
229234 if ( Navigating != null )
230235 {
@@ -239,7 +244,7 @@ internal virtual void Refresh(bool isNavigationIntercepted)
239244 ComponentsActivityHandle activityHandle ;
240245
241246 // In order to avoid routing twice we check for RouteData
242- if ( RoutingStateProvider ? . RouteData is { } endpointRouteData )
247+ if ( providerRouteData is { } endpointRouteData )
243248 {
244249 activityHandle = RecordDiagnostics ( endpointRouteData . PageType . FullName , endpointRouteData . Template ) ;
245250
@@ -312,6 +317,17 @@ internal virtual void Refresh(bool isNavigationIntercepted)
312317 _renderHandle . ComponentActivitySource ? . StopNavigateActivity ( activityHandle , null ) ;
313318 }
314319
320+ private static bool TryConsumeAllowRenderDuringPendingNavigation ( RouteData ? routeData )
321+ {
322+ if ( routeData ? . RouteValues . TryGetValue ( AllowRenderDuringPendingNavigationKey , out var value ) == true && value is true )
323+ {
324+ ( routeData . RouteValues as IDictionary < string , object ? > ) ? . Remove ( AllowRenderDuringPendingNavigationKey ) ;
325+ return true ;
326+ }
327+
328+ return false ;
329+ }
330+
315331 private ComponentsActivityHandle RecordDiagnostics ( string componentType , string template )
316332 {
317333 ComponentsActivityHandle activityHandle = default ;
0 commit comments