diff --git a/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs b/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs index 302dec7dcb16..5ed3f2ce195d 100644 --- a/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs +++ b/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs @@ -75,6 +75,7 @@ public static IRazorComponentsBuilder AddRazorComponents(this IServiceCollection services.TryAddScoped(); services.TryAddScoped(); + RegisterPersistentComponentStateServiceCollectionExtensions.AddPersistentServiceRegistration(services, RenderMode.InteractiveWebAssembly); // Form handling services.AddSupplyValueFromFormProvider(); diff --git a/src/Components/Shared/src/ResourceCollectionProvider.cs b/src/Components/Shared/src/ResourceCollectionProvider.cs index 78ebef9d13d2..957ba8bf3d97 100644 --- a/src/Components/Shared/src/ResourceCollectionProvider.cs +++ b/src/Components/Shared/src/ResourceCollectionProvider.cs @@ -11,22 +11,22 @@ namespace Microsoft.AspNetCore.Components; internal class ResourceCollectionProvider { - private const string ResourceCollectionUrlKey = "__ResourceCollectionUrl"; private string? _url; + + [SupplyParameterFromPersistentComponentState] + public string? ResourceCollectionUrl + { + get => _url; + set => _url = value; + } private ResourceAssetCollection? _resourceCollection; - private readonly PersistentComponentState _state; private readonly IJSRuntime _jsRuntime; - - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Strings are not trimmed")] - public ResourceCollectionProvider(PersistentComponentState state, IJSRuntime jsRuntime) + public ResourceCollectionProvider(IJSRuntime jsRuntime) { - _state = state; _jsRuntime = jsRuntime; - _ = _state.TryTakeFromJson(ResourceCollectionUrlKey, out _url); } [MemberNotNull(nameof(_url))] - [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "Strings are not trimmed")] internal void SetResourceCollectionUrl(string url) { if (_url != null) @@ -34,13 +34,6 @@ internal void SetResourceCollectionUrl(string url) throw new InvalidOperationException("The resource collection URL has already been set."); } _url = url; - PersistingComponentStateSubscription registration = default; - registration = _state.RegisterOnPersisting(() => - { - _state.PersistAsJson(ResourceCollectionUrlKey, _url); - registration.Dispose(); - return Task.CompletedTask; - }, RenderMode.InteractiveWebAssembly); } internal async Task GetResourceCollection() diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs index 218936a9c1d8..e90fdab63e70 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs @@ -308,6 +308,7 @@ internal void InitializeDefaultServices() Services.AddSupplyValueFromPersistentComponentStateProvider(); Services.AddSingleton(); Services.AddSingleton(); + RegisterPersistentComponentStateServiceCollectionExtensions.AddPersistentServiceRegistration(Services, RenderMode.InteractiveWebAssembly); Services.AddLogging(builder => { builder.AddProvider(new WebAssemblyConsoleLoggerProvider(DefaultWebAssemblyJSRuntime.Instance));