From 8ef19340c0afa2738700797089cb86addda8a79f Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 15 Sep 2023 15:28:14 +0100 Subject: [PATCH] Blazor Web project interactive options improvements. Rename render modes. (#50684) Fixes https://github.com/dotnet/aspnetcore/issues/50433 (Add root level interactivity option) Fixes https://github.com/dotnet/aspnetcore/issues/50646 (Remove workaround for Counter component) Fixes https://github.com/dotnet/aspnetcore/issues/50636 (Clarify the names of the interactive render modes) In terms of the code we now emit, there should be nothing controversial here. The template just has to do quite a bit of if/else in many places to account for all these options and how rendermodes are used and not used based on them. The PR is big because the renames have really wide impact, but almost all the "files changes" are just due to renames. The only real code changes are in the project templates. # Testing impact Adding this option, the BlazorWeb template now has **so many** possible combinations of options, including: - Whether or not to enable Server interactivity - Whether or not to enable WebAssembly interactivity - Whether or not to be interactive from the root - Whether or not to include sample content - Whether or not to use ProgramMain So that's around 32 combinations of output - without even accounting for auth options! We don't currently have E2E verification of any of them, as those tests are skipped due to unreliability. We're going to have to lean hard on CTI validations for this, and make sure all the important combinations are covered - cc @mkArtakMSFT. # Options design update Having a list of 6 separate checkboxes in VS is pretty unpleasant and hard to understand: So, in this PR I'm proposing (and have implemented, but we can still change it), a change to use dropdowns for the interactivity type and location options. This reduces the number of inputs by one, and means they can be more self-describing: * The "interactivity type" choices are: * **None** * **Server** (default) * **WebAssembly** * **Auto (Server and WebAssembly)**. * The "interactivity location" choices are: * **Per page/component** (default) * **Global** Note that "interactivity location" is disabled if interactivity type == "None", but [only CLI honors that right now](https://github.com/dotnet/templating/issues/5648) (VS should add support later, and until then, location will have no effect if there's no interactivity). I think this is much easier to understand, since you no longer have to infer that enabling both Server and WebAssembly means you're going to get Auto. It's also much better in the CLI, since it was completely ridiculous before that `--use-server` defaulted to true but `--use-wasm` defaulted to false, so to get WebAssembly you needed to set `--use-server false --use wasm`. Now you would say `--interactivity webassembly` (and not `wasm` - that was weird too). ![image](https://github.com/dotnet/aspnetcore/assets/1101362/0b4751ad-f91b-4bac-8edf-9e31aa761fbf) --- .../RazorComponentDataSourceOptions.cs | 8 +- .../RazorComponentEndpointDataSource.cs | 4 +- .../Endpoints/src/Discovery/ComponentInfo.cs | 18 +-- .../Discovery/RazorComponentApplication.cs | 14 +-- .../EndpointHtmlRenderer.PrerenderingState.cs | 12 +- .../src/Rendering/SSRRenderModeBoundary.cs | 24 ++-- .../test/EndpointHtmlRendererTest.cs | 32 ++--- .../Endpoints/test/HotReloadServiceTests.cs | 4 +- .../RazorComponentEndpointDataSourceTest.cs | 32 ++--- .../test/SSRRenderModeBoundaryTest.cs | 20 ++-- .../InteractiveGreetingServer.razor | 2 +- ...eractiveGreetingServerNonPrerendered.razor | 2 +- .../InteractiveGreetingWebAssembly.razor | 2 +- ...iveGreetingWebAssemblyNonPrerendered.razor | 2 +- .../InteractiveWithInteractiveChild.razor | 2 +- .../src/Builder/InternalServerRenderMode.cs | 2 +- ...entsEndpointConventionBuilderExtensions.cs | 4 +- .../Server/src/Circuits/RemoteRenderer.cs | 2 +- .../ServerRazorComponentsBuilderExtensions.cs | 8 +- .../Server/src/PublicAPI.Unshipped.txt | 4 +- .../test/Circuits/RenderBatchWriterTest.cs | 2 +- .../Web/src/PublicAPI.Unshipped.txt | 54 ++++----- ...erMode.cs => InteractiveAutoRenderMode.cs} | 12 +- ...Mode.cs => InteractiveServerRenderMode.cs} | 10 +- ...cs => InteractiveWebAssemblyRenderMode.cs} | 12 +- .../Web/src/RenderMode/RenderMode.cs | 6 +- .../TemporaryRenderModeAttributes.cs | 36 +++--- ...entsEndpointConventionBuilderExtensions.cs | 4 +- .../WebAssemblyRenderModeWithOptions.cs | 2 +- .../Server/src/PublicAPI.Unshipped.txt | 4 +- ...ssemblyRazorComponentsBuilderExtensions.cs | 8 +- .../src/Rendering/WebAssemblyRenderer.cs | 2 +- .../BlazorWebServerStartup.cs | 4 +- .../RazorComponentEndpointsStartup.cs | 8 +- ...teractiveStreamingRenderingComponent.razor | 12 +- .../Components/ServerInteractiveCounter.razor | 2 +- .../Auth/InteractiveAuthenticationState.razor | 2 +- .../Pages/CallSiteInteractiveComponents.razor | 4 +- ...ithInteractiveComponentsThatNavigate.razor | 4 +- ...tualizationTransitionToInteractivity.razor | 4 +- .../Pages/Rendering/LargeHtml.razor | 6 +- .../RazorComponents/Root.razor | 2 +- .../ServerInteractiveCounter.razor | 2 +- .../WebAssemblyInteractiveCounter.razor | 2 +- .../PersistComponentStateTagHelperTest.cs | 8 +- .../HtmlHelperComponentExtensions.cs | 8 +- .../ComponentRenderingFunctionalTests.cs | 6 +- src/ProjectTemplates/Shared/ArgConstants.cs | 2 +- .../.template.config/dotnetcli.host.json | 12 +- .../.template.config/ide.host.json | 8 +- .../localize/templatestrings.cs.json | 22 +++- .../localize/templatestrings.de.json | 22 +++- .../localize/templatestrings.en.json | 22 +++- .../localize/templatestrings.es.json | 22 +++- .../localize/templatestrings.fr.json | 22 +++- .../localize/templatestrings.it.json | 22 +++- .../localize/templatestrings.ja.json | 22 +++- .../localize/templatestrings.ko.json | 22 +++- .../localize/templatestrings.pl.json | 22 +++- .../localize/templatestrings.pt-BR.json | 22 +++- .../localize/templatestrings.ru.json | 22 +++- .../localize/templatestrings.tr.json | 22 +++- .../localize/templatestrings.zh-Hans.json | 22 +++- .../localize/templatestrings.zh-Hant.json | 22 +++- .../.template.config/template.json | 85 +++++++++++-- .../Pages/Counter.razor | 9 +- .../BlazorWeb-CSharp/Components/App.razor | 20 +++- .../Components/Pages/Counter.razor | 12 +- .../Components/Pages/Weather.razor | 8 +- .../BlazorWeb-CSharp/Components/Routes.razor | 6 +- .../Components/_Imports.razor | 3 + .../BlazorWeb-CSharp/Program.Main.cs | 22 ++-- .../BlazorWeb-CSharp/Program.cs | 21 ++-- .../BlazorWeb-CSharp/wwwroot/app.css | 8 +- .../BlazorWebTemplateTest.cs | 10 +- .../Templates.Tests/template-baselines.json | 112 ++++++++++++++++-- 76 files changed, 725 insertions(+), 345 deletions(-) rename src/Components/Web/src/RenderMode/{AutoRenderMode.cs => InteractiveAutoRenderMode.cs} (64%) rename src/Components/Web/src/RenderMode/{ServerRenderMode.cs => InteractiveServerRenderMode.cs} (71%) rename src/Components/Web/src/RenderMode/{WebAssemblyRenderMode.cs => InteractiveWebAssemblyRenderMode.cs} (63%) diff --git a/src/Components/Endpoints/src/Builder/RazorComponentDataSourceOptions.cs b/src/Components/Endpoints/src/Builder/RazorComponentDataSourceOptions.cs index 953be437550b..89d9b9e4f43e 100644 --- a/src/Components/Endpoints/src/Builder/RazorComponentDataSourceOptions.cs +++ b/src/Components/Endpoints/src/Builder/RazorComponentDataSourceOptions.cs @@ -17,14 +17,14 @@ internal class RazorComponentDataSourceOptions .Create( equals: (x, y) => (x,y) switch { - (ServerRenderMode, ServerRenderMode) => true, - (WebAssemblyRenderMode, WebAssemblyRenderMode) => true, + (InteractiveServerRenderMode, InteractiveServerRenderMode) => true, + (InteractiveWebAssemblyRenderMode, InteractiveWebAssemblyRenderMode) => true, _ => false, }, getHashCode: obj => obj switch { - ServerRenderMode => 1, - WebAssemblyRenderMode => 2, + InteractiveServerRenderMode => 1, + InteractiveWebAssemblyRenderMode => 2, _ => throw new InvalidOperationException($"Unknown render mode: {obj}"), }); diff --git a/src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs b/src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs index 8013ab54794d..58a7ac8d656f 100644 --- a/src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs +++ b/src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs @@ -129,8 +129,8 @@ private void UpdateEndpoints() if (!found) { throw new InvalidOperationException($"Unable to find a provider for the render mode: {renderMode.GetType().FullName}. This generally " + - "means that a call to 'AddWebAssemblyComponents' or 'AddServerComponents' is missing. " + - "For example, change builder.Services.AddRazorComponents() to builder.Services.AddRazorComponents().AddServerComponents()."); + "means that a call to 'AddInteractiveWebAssemblyComponents' or 'AddInteractiveServerComponents' is missing. " + + "For example, change builder.Services.AddRazorComponents() to builder.Services.AddRazorComponents().AddInteractiveServerComponents()."); } } diff --git a/src/Components/Endpoints/src/Discovery/ComponentInfo.cs b/src/Components/Endpoints/src/Discovery/ComponentInfo.cs index 89b52d189d3d..00e74b52dae0 100644 --- a/src/Components/Endpoints/src/Discovery/ComponentInfo.cs +++ b/src/Components/Endpoints/src/Discovery/ComponentInfo.cs @@ -51,20 +51,20 @@ private string GetDebuggerDisplay() private string GetRenderMode() { - if (RenderMode is ServerRenderMode { Prerender: var server }) + if (RenderMode is InteractiveServerRenderMode { Prerender: var server }) { - var size = (nameof(ServerRenderMode).Length - "RenderModeComparer".Length); - return $"RenderModeComparer = {nameof(ServerRenderMode)[0..size]}, Prerendered = {server}"; + var size = (nameof(InteractiveServerRenderMode).Length - "RenderModeComparer".Length); + return $"RenderModeComparer = {nameof(InteractiveServerRenderMode)[0..size]}, Prerendered = {server}"; } - if (RenderMode is WebAssemblyRenderMode { Prerender: var wasm }) + if (RenderMode is InteractiveWebAssemblyRenderMode { Prerender: var wasm }) { - var size = (nameof(WebAssemblyRenderMode).Length - "RenderModeComparer".Length); - return $"RenderModeComparer = {nameof(WebAssemblyRenderMode)[0..size]}, Prerendered = {wasm}"; + var size = (nameof(InteractiveWebAssemblyRenderMode).Length - "RenderModeComparer".Length); + return $"RenderModeComparer = {nameof(InteractiveWebAssemblyRenderMode)[0..size]}, Prerendered = {wasm}"; } - if (RenderMode is AutoRenderMode { Prerender: var auto }) + if (RenderMode is InteractiveAutoRenderMode { Prerender: var auto }) { - var size = (nameof(AutoRenderMode).Length - "RenderModeComparer".Length); - return $"RenderModeComparer = {nameof(AutoRenderMode)[0..size]}, Prerendered = {auto}"; + var size = (nameof(InteractiveAutoRenderMode).Length - "RenderModeComparer".Length); + return $"RenderModeComparer = {nameof(InteractiveAutoRenderMode)[0..size]}, Prerendered = {auto}"; } return "RenderModeComparer = Unknown, Prerendered = Unknown"; diff --git a/src/Components/Endpoints/src/Discovery/RazorComponentApplication.cs b/src/Components/Endpoints/src/Discovery/RazorComponentApplication.cs index 1583c5ce8965..29f20f083e06 100644 --- a/src/Components/Endpoints/src/Discovery/RazorComponentApplication.cs +++ b/src/Components/Endpoints/src/Discovery/RazorComponentApplication.cs @@ -42,15 +42,15 @@ public ISet GetDeclaredRenderModesByDiscoveredComponents() var component = Components[i]; switch (component.RenderMode) { - case ServerRenderMode: - set.Add(RenderMode.Server); + case InteractiveServerRenderMode: + set.Add(RenderMode.InteractiveServer); break; - case WebAssemblyRenderMode: - set.Add(RenderMode.WebAssembly); + case InteractiveWebAssemblyRenderMode: + set.Add(RenderMode.InteractiveWebAssembly); break; - case AutoRenderMode: - set.Add(RenderMode.Server); - set.Add(RenderMode.WebAssembly); + case InteractiveAutoRenderMode: + set.Add(RenderMode.InteractiveServer); + set.Add(RenderMode.InteractiveWebAssembly); break; default: break; diff --git a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.PrerenderingState.cs b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.PrerenderingState.cs index baf91c157786..3b710374d38f 100644 --- a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.PrerenderingState.cs +++ b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.PrerenderingState.cs @@ -65,9 +65,9 @@ internal static void UpdateSaveStateRenderMode(HttpContext httpContext, ICompone { var currentInvocation = mode switch { - ServerRenderMode => InvokedRenderModes.Mode.Server, - WebAssemblyRenderMode => InvokedRenderModes.Mode.WebAssembly, - AutoRenderMode => throw new NotImplementedException("TODO: To be able to support AutoRenderMode, we have to serialize persisted state in both WebAssembly and Server formats, or unify the two formats."), + InteractiveServerRenderMode => InvokedRenderModes.Mode.Server, + InteractiveWebAssemblyRenderMode => InvokedRenderModes.Mode.WebAssembly, + InteractiveAutoRenderMode => throw new NotImplementedException("TODO: To be able to support InteractiveAutoRenderMode, we have to serialize persisted state in both WebAssembly and Server formats, or unify the two formats."), _ => throw new ArgumentException(Resources.FormatUnsupportedRenderMode(mode), nameof(mode)), }; @@ -88,9 +88,9 @@ internal static void UpdateSaveStateRenderMode(HttpContext httpContext, ICompone private static bool ModeEnablesPrerendering(IComponentRenderMode? mode) => mode switch { - ServerRenderMode { Prerender: true } => true, - WebAssemblyRenderMode { Prerender: true } => true, - AutoRenderMode { Prerender: true } => true, + InteractiveServerRenderMode { Prerender: true } => true, + InteractiveWebAssemblyRenderMode { Prerender: true } => true, + InteractiveAutoRenderMode { Prerender: true } => true, _ => false }; diff --git a/src/Components/Endpoints/src/Rendering/SSRRenderModeBoundary.cs b/src/Components/Endpoints/src/Rendering/SSRRenderModeBoundary.cs index f0ac9aaba6db..66a9331c0f1a 100644 --- a/src/Components/Endpoints/src/Rendering/SSRRenderModeBoundary.cs +++ b/src/Components/Endpoints/src/Rendering/SSRRenderModeBoundary.cs @@ -43,9 +43,9 @@ public SSRRenderModeBoundary( _renderMode = renderMode; _prerender = renderMode switch { - ServerRenderMode mode => mode.Prerender, - WebAssemblyRenderMode mode => mode.Prerender, - AutoRenderMode mode => mode.Prerender, + InteractiveServerRenderMode mode => mode.Prerender, + InteractiveWebAssemblyRenderMode mode => mode.Prerender, + InteractiveAutoRenderMode mode => mode.Prerender, _ => throw new ArgumentException($"Server-side rendering does not support the render mode '{renderMode}'.", nameof(renderMode)) }; } @@ -65,14 +65,14 @@ private static void AssertRenderModeIsConfigured(HttpContext httpContext, Type c var configuredModes = configuredRenderModesMetadata.ConfiguredRenderModes; // We have to allow for specified rendermodes being subclases of the known types - if (renderMode is ServerRenderMode || renderMode is AutoRenderMode) + if (renderMode is InteractiveServerRenderMode || renderMode is InteractiveAutoRenderMode) { - AssertRenderModeIsConfigured(componentType, renderMode, configuredModes, "AddServerRenderMode"); + AssertRenderModeIsConfigured(componentType, renderMode, configuredModes, "AddInteractiveServerRenderMode"); } - if (renderMode is WebAssemblyRenderMode || renderMode is AutoRenderMode) + if (renderMode is InteractiveWebAssemblyRenderMode || renderMode is InteractiveAutoRenderMode) { - AssertRenderModeIsConfigured(componentType, renderMode, configuredModes, "AddWebAssemblyRenderMode"); + AssertRenderModeIsConfigured(componentType, renderMode, configuredModes, "AddInteractiveWebAssemblyRenderMode"); } } @@ -165,13 +165,13 @@ public ComponentMarker ToMarker(HttpContext httpContext, int sequence, object? k var marker = _renderMode switch { - ServerRenderMode server => ComponentMarker.Create(ComponentMarker.ServerMarkerType, server.Prerender, _markerKey), - WebAssemblyRenderMode webAssembly => ComponentMarker.Create(ComponentMarker.WebAssemblyMarkerType, webAssembly.Prerender, _markerKey), - AutoRenderMode auto => ComponentMarker.Create(ComponentMarker.AutoMarkerType, auto.Prerender, _markerKey), + InteractiveServerRenderMode server => ComponentMarker.Create(ComponentMarker.ServerMarkerType, server.Prerender, _markerKey), + InteractiveWebAssemblyRenderMode webAssembly => ComponentMarker.Create(ComponentMarker.WebAssemblyMarkerType, webAssembly.Prerender, _markerKey), + InteractiveAutoRenderMode auto => ComponentMarker.Create(ComponentMarker.AutoMarkerType, auto.Prerender, _markerKey), _ => throw new UnreachableException($"Unknown render mode {_renderMode.GetType().FullName}"), }; - if (_renderMode is ServerRenderMode or AutoRenderMode) + if (_renderMode is InteractiveServerRenderMode or InteractiveAutoRenderMode) { // Lazy because we don't actually want to require a whole chain of services including Data Protection // to be required unless you actually use Server render mode. @@ -181,7 +181,7 @@ public ComponentMarker ToMarker(HttpContext httpContext, int sequence, object? k serverComponentSerializer.SerializeInvocation(ref marker, invocationId, _componentType, parameters); } - if (_renderMode is WebAssemblyRenderMode or AutoRenderMode) + if (_renderMode is InteractiveWebAssemblyRenderMode or InteractiveAutoRenderMode) { WebAssemblyComponentSerializer.SerializeInvocation(ref marker, _componentType, parameters); } diff --git a/src/Components/Endpoints/test/EndpointHtmlRendererTest.cs b/src/Components/Endpoints/test/EndpointHtmlRendererTest.cs index a2c730f1f21c..65c4d0692051 100644 --- a/src/Components/Endpoints/test/EndpointHtmlRendererTest.cs +++ b/src/Components/Endpoints/test/EndpointHtmlRendererTest.cs @@ -53,7 +53,7 @@ public async Task CanRender_ParameterlessComponent_ClientMode() var writer = new StringWriter(); // Act - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new WebAssemblyRenderMode(prerender: false), ParameterView.Empty); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new InteractiveWebAssemblyRenderMode(prerender: false), ParameterView.Empty); await renderer.Dispatcher.InvokeAsync(() => result.WriteTo(writer, HtmlEncoder.Default)); var content = writer.ToString(); var match = Regex.Match(content, ComponentPattern); @@ -76,7 +76,7 @@ public async Task CanPrerender_ParameterlessComponent_ClientMode() var writer = new StringWriter(); // Act - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), RenderMode.WebAssembly, ParameterView.Empty); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), RenderMode.InteractiveWebAssembly, ParameterView.Empty); await renderer.Dispatcher.InvokeAsync(() => result.WriteTo(writer, HtmlEncoder.Default)); var content = writer.ToString(); var match = Regex.Match(content, PrerenderedComponentPattern, RegexOptions.Multiline); @@ -115,7 +115,7 @@ public async Task CanRender_ComponentWithParameters_ClientMode() // Act var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), - new WebAssemblyRenderMode(prerender: false), + new InteractiveWebAssemblyRenderMode(prerender: false), ParameterView.FromDictionary(new Dictionary { { "Name", "Daniel" } @@ -152,7 +152,7 @@ public async Task CanRender_ComponentWithNullParameters_ClientMode() // Act var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), - new WebAssemblyRenderMode(prerender: false), + new InteractiveWebAssemblyRenderMode(prerender: false), ParameterView.FromDictionary(new Dictionary { { "Name", null } @@ -187,7 +187,7 @@ public async Task CanPrerender_ComponentWithParameters_ClientMode() // Act var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), - RenderMode.WebAssembly, + RenderMode.InteractiveWebAssembly, ParameterView.FromDictionary(new Dictionary { { "Name", "Daniel" } @@ -236,7 +236,7 @@ public async Task CanPrerender_ComponentWithNullParameters_ClientMode() // Act var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), - RenderMode.WebAssembly, + RenderMode.InteractiveWebAssembly, ParameterView.FromDictionary(new Dictionary { { "Name", null } @@ -300,7 +300,7 @@ public async Task CanRender_ParameterlessComponent_ServerMode() .ToTimeLimitedDataProtector(); // Act - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new ServerRenderMode(false), ParameterView.Empty); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new InteractiveServerRenderMode(false), ParameterView.Empty); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, ComponentPattern); @@ -332,7 +332,7 @@ public async Task CanPrerender_ParameterlessComponent_ServerMode() .ToTimeLimitedDataProtector(); // Act - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), RenderMode.Server, ParameterView.Empty); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), RenderMode.InteractiveServer, ParameterView.Empty); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, PrerenderedComponentPattern, RegexOptions.Multiline); @@ -376,8 +376,8 @@ public async Task Prerender_ServerAndClientComponentUpdatesInvokedPrerenderModes // Act var parameters = ParameterView.FromDictionary(new Dictionary { { "Name", "SomeName" } }); - var server = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.Server, parameters); - var client = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.WebAssembly, parameters); + var server = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.InteractiveServer, parameters); + var client = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.InteractiveWebAssembly, parameters); // Assert var (_, mode) = Assert.Single(httpContext.Items, (kvp) => kvp.Value is InvokedRenderModes); @@ -393,11 +393,11 @@ public async Task CanRenderMultipleServerComponents() .ToTimeLimitedDataProtector(); // Act - var firstResult = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new ServerRenderMode(true), ParameterView.Empty); + var firstResult = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new InteractiveServerRenderMode(true), ParameterView.Empty); var firstComponent = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(firstResult)); var firstMatch = Regex.Match(firstComponent, PrerenderedComponentPattern, RegexOptions.Multiline); - var secondResult = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new ServerRenderMode(false), ParameterView.Empty); + var secondResult = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), new InteractiveServerRenderMode(false), ParameterView.Empty); var secondComponent = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(secondResult)); var secondMatch = Regex.Match(secondComponent, ComponentPattern); @@ -451,7 +451,7 @@ public async Task CanRender_ComponentWithParameters_ServerMode() // Act var parameters = ParameterView.FromDictionary(new Dictionary { { "Name", "SomeName" } }); - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), new ServerRenderMode(false), parameters); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), new InteractiveServerRenderMode(false), parameters); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, ComponentPattern); @@ -490,7 +490,7 @@ public async Task CanRender_ComponentWithNullParameters_ServerMode() // Act var parameters = ParameterView.FromDictionary(new Dictionary { { "Name", null } }); - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), new ServerRenderMode(false), parameters); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), new InteractiveServerRenderMode(false), parameters); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, ComponentPattern); @@ -529,7 +529,7 @@ public async Task CanPrerender_ComponentWithParameters_ServerPrerenderedMode() // Act var parameters = ParameterView.FromDictionary(new Dictionary { { "Name", "SomeName" } }); - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.Server, parameters); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.InteractiveServer, parameters); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, PrerenderedComponentPattern, RegexOptions.Multiline); @@ -580,7 +580,7 @@ public async Task CanPrerender_ComponentWithNullParameters_ServerPrerenderedMode // Act var parameters = ParameterView.FromDictionary(new Dictionary { { "Name", null } }); - var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.Server, parameters); + var result = await renderer.PrerenderComponentAsync(httpContext, typeof(GreetingComponent), RenderMode.InteractiveServer, parameters); var content = await renderer.Dispatcher.InvokeAsync(() => HtmlContentToString(result)); var match = Regex.Match(content, PrerenderedComponentPattern, RegexOptions.Multiline); diff --git a/src/Components/Endpoints/test/HotReloadServiceTests.cs b/src/Components/Endpoints/test/HotReloadServiceTests.cs index afa86e09971e..4250b6c66945 100644 --- a/src/Components/Endpoints/test/HotReloadServiceTests.cs +++ b/src/Components/Endpoints/test/HotReloadServiceTests.cs @@ -187,7 +187,7 @@ private static RazorComponentEndpointDataSource CreateDataSource CreateDataSource() }, @@ -186,7 +186,7 @@ public void NoDiscoveredModesDefaultsToStatic() // Webassembly explicitly configured and missing { - new IComponentRenderMode[] { RenderMode.WebAssembly }, + new IComponentRenderMode[] { RenderMode.InteractiveWebAssembly }, new [] { typeof(ServerEndpointProvider) }, Array.Empty() }, @@ -242,13 +242,13 @@ private RazorComponentEndpointDataSource CreateDataSource GetEndpointBuilders(IComponent 0); } - public override bool Supports(IComponentRenderMode renderMode) => renderMode is ServerRenderMode or AutoRenderMode; + public override bool Supports(IComponentRenderMode renderMode) => renderMode is InteractiveServerRenderMode or InteractiveAutoRenderMode; } private class WebassemblyEndpointProvider : RenderModeEndpointProvider @@ -274,7 +274,7 @@ public override IEnumerable GetEndpointBuilders(IComponent 0); } - public override bool Supports(IComponentRenderMode renderMode) => renderMode is WebAssemblyRenderMode or AutoRenderMode; + public override bool Supports(IComponentRenderMode renderMode) => renderMode is InteractiveWebAssemblyRenderMode or InteractiveAutoRenderMode; } } diff --git a/src/Components/Endpoints/test/SSRRenderModeBoundaryTest.cs b/src/Components/Endpoints/test/SSRRenderModeBoundaryTest.cs index 09e7ec399feb..a5db11e45c06 100644 --- a/src/Components/Endpoints/test/SSRRenderModeBoundaryTest.cs +++ b/src/Components/Endpoints/test/SSRRenderModeBoundaryTest.cs @@ -20,9 +20,9 @@ public void DoesNotAssertAboutConfiguredRenderModesOnUnknownEndpoints() httpContext.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(), null)); // Act/Assert: no exception means we're OK - new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new ServerRenderMode()); - new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new WebAssemblyRenderMode()); - new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new AutoRenderMode()); + new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new InteractiveServerRenderMode()); + new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new InteractiveWebAssemblyRenderMode()); + new SSRRenderModeBoundary(httpContext, typeof(TestComponent), new InteractiveAutoRenderMode()); } [Fact] @@ -36,7 +36,7 @@ public void ThrowsIfServerRenderModeUsedAndNotConfigured() var ex = Assert.Throws(() => new SSRRenderModeBoundary( httpContext, typeof(TestComponent), new ServerRenderModeSubclass())); Assert.Contains($"A component of type '{typeof(TestComponent)}' has render mode '{nameof(ServerRenderModeSubclass)}'", ex.Message); - Assert.Contains($"add a call to 'AddServerRenderMode'", ex.Message); + Assert.Contains($"add a call to 'AddInteractiveServerRenderMode'", ex.Message); } [Fact] @@ -50,7 +50,7 @@ public void ThrowsIfWebAssemblyRenderModeUsedAndNotConfigured() var ex = Assert.Throws(() => new SSRRenderModeBoundary( httpContext, typeof(TestComponent), new WebAssemblyRenderModeSubclass())); Assert.Contains($"A component of type '{typeof(TestComponent)}' has render mode '{nameof(WebAssemblyRenderModeSubclass)}'", ex.Message); - Assert.Contains($"add a call to 'AddWebAssemblyRenderMode'", ex.Message); + Assert.Contains($"add a call to 'AddInteractiveWebAssemblyRenderMode'", ex.Message); } [Fact] @@ -64,7 +64,7 @@ public void ThrowsIfAutoRenderModeUsedAndServerNotConfigured() var ex = Assert.Throws(() => new SSRRenderModeBoundary( httpContext, typeof(TestComponent), new AutoRenderModeSubclass())); Assert.Contains($"A component of type '{typeof(TestComponent)}' has render mode '{nameof(AutoRenderModeSubclass)}'", ex.Message); - Assert.Contains($"add a call to 'AddServerRenderMode'", ex.Message); + Assert.Contains($"add a call to 'AddInteractiveServerRenderMode'", ex.Message); } [Fact] @@ -78,7 +78,7 @@ public void ThrowsIfAutoRenderModeUsedAndWebAssemblyNotConfigured() var ex = Assert.Throws(() => new SSRRenderModeBoundary( httpContext, typeof(TestComponent), new AutoRenderModeSubclass())); Assert.Contains($"A component of type '{typeof(TestComponent)}' has render mode '{nameof(AutoRenderModeSubclass)}'", ex.Message); - Assert.Contains($"add a call to 'AddWebAssemblyRenderMode'", ex.Message); + Assert.Contains($"add a call to 'AddInteractiveWebAssemblyRenderMode'", ex.Message); } private static void PrepareEndpoint(HttpContext httpContext, params IComponentRenderMode[] configuredModes) @@ -96,7 +96,7 @@ public Task SetParametersAsync(ParameterView parameters) => throw new NotImplementedException(); } - class ServerRenderModeSubclass : ServerRenderMode { } - class WebAssemblyRenderModeSubclass : WebAssemblyRenderMode { } - class AutoRenderModeSubclass : AutoRenderMode { } + class ServerRenderModeSubclass : InteractiveServerRenderMode { } + class WebAssemblyRenderModeSubclass : InteractiveWebAssemblyRenderMode { } + class AutoRenderModeSubclass : InteractiveAutoRenderMode { } } diff --git a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServer.razor b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServer.razor index 513134b3fae9..aa7f084f6773 100644 --- a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServer.razor +++ b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServer.razor @@ -1,5 +1,5 @@ @using Microsoft.AspNetCore.Components.Web -@attribute [RenderModeServer] +@attribute [RenderModeInteractiveServer]

Hello @(Name ?? "(null)")!

diff --git a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServerNonPrerendered.razor b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServerNonPrerendered.razor index 76aaea3b855f..689dc5341d1f 100644 --- a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServerNonPrerendered.razor +++ b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingServerNonPrerendered.razor @@ -1,5 +1,5 @@ @using Microsoft.AspNetCore.Components.Web -@attribute [RenderModeServer(false)] +@attribute [RenderModeInteractiveServer(false)]

Hello @(Name ?? "(null)")!

diff --git a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssembly.razor b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssembly.razor index dc1573360f3b..ec1f31503186 100644 --- a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssembly.razor +++ b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssembly.razor @@ -1,5 +1,5 @@ @using Microsoft.AspNetCore.Components.Web -@attribute [RenderModeWebAssembly] +@attribute [RenderModeInteractiveWebAssembly]

Hello @(Name ?? "(null)")!

diff --git a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssemblyNonPrerendered.razor b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssemblyNonPrerendered.razor index 56293c9e76eb..e7ba8104493f 100644 --- a/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssemblyNonPrerendered.razor +++ b/src/Components/Endpoints/test/TestComponents/InteractiveGreetingWebAssemblyNonPrerendered.razor @@ -1,5 +1,5 @@ @using Microsoft.AspNetCore.Components.Web -@attribute [RenderModeWebAssembly(false)] +@attribute [RenderModeInteractiveWebAssembly(false)]

Hello @(Name ?? "(null)")!

diff --git a/src/Components/Endpoints/test/TestComponents/InteractiveWithInteractiveChild.razor b/src/Components/Endpoints/test/TestComponents/InteractiveWithInteractiveChild.razor index f16bb8ded8b0..1856ef793879 100644 --- a/src/Components/Endpoints/test/TestComponents/InteractiveWithInteractiveChild.razor +++ b/src/Components/Endpoints/test/TestComponents/InteractiveWithInteractiveChild.razor @@ -1,5 +1,5 @@ @using Microsoft.AspNetCore.Components.Web -@attribute [RenderModeWebAssembly] +@attribute [RenderModeInteractiveWebAssembly]

This is @nameof(InteractiveWithInteractiveChild)

diff --git a/src/Components/Server/src/Builder/InternalServerRenderMode.cs b/src/Components/Server/src/Builder/InternalServerRenderMode.cs index c690a8a7e25f..4bff43cca838 100644 --- a/src/Components/Server/src/Builder/InternalServerRenderMode.cs +++ b/src/Components/Server/src/Builder/InternalServerRenderMode.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNetCore.Builder; -internal class InternalServerRenderMode : ServerRenderMode +internal class InternalServerRenderMode : InteractiveServerRenderMode { } diff --git a/src/Components/Server/src/Builder/ServerRazorComponentsEndpointConventionBuilderExtensions.cs b/src/Components/Server/src/Builder/ServerRazorComponentsEndpointConventionBuilderExtensions.cs index 1930aed2448b..90ec6aea2e0f 100644 --- a/src/Components/Server/src/Builder/ServerRazorComponentsEndpointConventionBuilderExtensions.cs +++ b/src/Components/Server/src/Builder/ServerRazorComponentsEndpointConventionBuilderExtensions.cs @@ -12,10 +12,10 @@ namespace Microsoft.AspNetCore.Builder; public static class ServerRazorComponentsEndpointConventionBuilderExtensions { /// - /// Configures the for this application. + /// Configures the application to support the render mode. /// /// The . - public static RazorComponentsEndpointConventionBuilder AddServerRenderMode(this RazorComponentsEndpointConventionBuilder builder) + public static RazorComponentsEndpointConventionBuilder AddInteractiveServerRenderMode(this RazorComponentsEndpointConventionBuilder builder) { ComponentEndpointConventionBuilderHelper.AddRenderMode(builder, new InternalServerRenderMode()); return builder; diff --git a/src/Components/Server/src/Circuits/RemoteRenderer.cs b/src/Components/Server/src/Circuits/RemoteRenderer.cs index 991e936c1932..40f2f7a87a4c 100644 --- a/src/Components/Server/src/Circuits/RemoteRenderer.cs +++ b/src/Components/Server/src/Circuits/RemoteRenderer.cs @@ -386,7 +386,7 @@ public Task OnRenderCompletedAsync(long incomingBatchId, string? errorMessageOrN protected override IComponent ResolveComponentForRenderMode([DynamicallyAccessedMembers(Component)] Type componentType, int? parentComponentId, IComponentActivator componentActivator, IComponentRenderMode renderMode) => renderMode switch { - ServerRenderMode or AutoRenderMode => componentActivator.CreateInstance(componentType), + InteractiveServerRenderMode or InteractiveAutoRenderMode => componentActivator.CreateInstance(componentType), _ => throw new NotSupportedException($"Cannot create a component of type '{componentType}' because its render mode '{renderMode}' is not supported by interactive server-side rendering."), }; diff --git a/src/Components/Server/src/DependencyInjection/ServerRazorComponentsBuilderExtensions.cs b/src/Components/Server/src/DependencyInjection/ServerRazorComponentsBuilderExtensions.cs index 58ec3c70be01..4a52c20e7d6e 100644 --- a/src/Components/Server/src/DependencyInjection/ServerRazorComponentsBuilderExtensions.cs +++ b/src/Components/Server/src/DependencyInjection/ServerRazorComponentsBuilderExtensions.cs @@ -25,7 +25,7 @@ public static class ServerRazorComponentsBuilderExtensions /// A callback to configure . /// An that can be used to further customize the configuration. [RequiresUnreferencedCode("Server-side Blazor does not currently support native AOT.", Url = "https://aka.ms/aspnet/nativeaot")] - public static IServerSideBlazorBuilder AddServerComponents(this IRazorComponentsBuilder builder, Action? configure = null) + public static IServerSideBlazorBuilder AddInteractiveServerComponents(this IRazorComponentsBuilder builder, Action? configure = null) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); @@ -55,9 +55,9 @@ public override IEnumerable GetEndpointBuilders( { if (renderMode is not InternalServerRenderMode) { - if (renderMode is ServerRenderMode) + if (renderMode is InteractiveServerRenderMode) { - throw new InvalidOperationException("Invalid render mode. Use AddServerRenderMode() to configure the Server render mode."); + throw new InvalidOperationException("Invalid render mode. Use AddInteractiveServerRenderMode() to configure the Server render mode."); } return Array.Empty(); @@ -73,7 +73,7 @@ public override bool Supports(IComponentRenderMode renderMode) { return renderMode switch { - ServerRenderMode _ or AutoRenderMode _ => true, + InteractiveServerRenderMode _ or InteractiveAutoRenderMode _ => true, _ => false, }; } diff --git a/src/Components/Server/src/PublicAPI.Unshipped.txt b/src/Components/Server/src/PublicAPI.Unshipped.txt index ed39a35c63b5..dd03124a4909 100644 --- a/src/Components/Server/src/PublicAPI.Unshipped.txt +++ b/src/Components/Server/src/PublicAPI.Unshipped.txt @@ -3,6 +3,6 @@ Microsoft.AspNetCore.Builder.ServerRazorComponentsEndpointConventionBuilderExten Microsoft.AspNetCore.Components.Server.Circuits.CircuitInboundActivityContext Microsoft.AspNetCore.Components.Server.Circuits.CircuitInboundActivityContext.Circuit.get -> Microsoft.AspNetCore.Components.Server.Circuits.Circuit! Microsoft.Extensions.DependencyInjection.ServerRazorComponentsBuilderExtensions -static Microsoft.AspNetCore.Builder.ServerRazorComponentsEndpointConventionBuilderExtensions.AddServerRenderMode(this Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! builder) -> Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! -static Microsoft.Extensions.DependencyInjection.ServerRazorComponentsBuilderExtensions.AddServerComponents(this Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.DependencyInjection.IServerSideBlazorBuilder! +static Microsoft.AspNetCore.Builder.ServerRazorComponentsEndpointConventionBuilderExtensions.AddInteractiveServerRenderMode(this Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! builder) -> Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! +static Microsoft.Extensions.DependencyInjection.ServerRazorComponentsBuilderExtensions.AddInteractiveServerComponents(this Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.DependencyInjection.IServerSideBlazorBuilder! virtual Microsoft.AspNetCore.Components.Server.Circuits.CircuitHandler.CreateInboundActivityHandler(System.Func! next) -> System.Func! diff --git a/src/Components/Server/test/Circuits/RenderBatchWriterTest.cs b/src/Components/Server/test/Circuits/RenderBatchWriterTest.cs index 274670dce00a..cb84da770fa6 100644 --- a/src/Components/Server/test/Circuits/RenderBatchWriterTest.cs +++ b/src/Components/Server/test/Circuits/RenderBatchWriterTest.cs @@ -215,7 +215,7 @@ public void CanIncludeReferenceFrames() RenderTreeFrame.Markup(132, "Some markup"), RenderTreeFrame.Text(133, "\n\t "), RenderTreeFrame.NamedEvent(135, "SomeEventType", "Some assigned name"), - RenderTreeFrame.ComponentRenderModeFrame(136, RenderMode.Auto), + RenderTreeFrame.ComponentRenderModeFrame(136, RenderMode.InteractiveAuto), // Testing deduplication RenderTreeFrame.Attribute(200, "Attribute with string value", "String value"), diff --git a/src/Components/Web/src/PublicAPI.Unshipped.txt b/src/Components/Web/src/PublicAPI.Unshipped.txt index b23d101f56fb..dddd2a2fcceb 100644 --- a/src/Components/Web/src/PublicAPI.Unshipped.txt +++ b/src/Components/Web/src/PublicAPI.Unshipped.txt @@ -69,10 +69,6 @@ Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.Name.set -> voi Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.FormName.get -> string? Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.FormName.set -> void Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.SupplyParameterFromFormAttribute() -> void -Microsoft.AspNetCore.Components.Web.AutoRenderMode -Microsoft.AspNetCore.Components.Web.AutoRenderMode.AutoRenderMode() -> void -Microsoft.AspNetCore.Components.Web.AutoRenderMode.AutoRenderMode(bool prerender) -> void -Microsoft.AspNetCore.Components.Web.AutoRenderMode.Prerender.get -> bool Microsoft.AspNetCore.Components.Web.HtmlRenderer Microsoft.AspNetCore.Components.Web.HtmlRenderer.BeginRenderingComponent(System.Type! componentType) -> Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent Microsoft.AspNetCore.Components.Web.HtmlRenderer.BeginRenderingComponent(System.Type! componentType, Microsoft.AspNetCore.Components.ParameterView parameters) -> Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent @@ -91,35 +87,39 @@ Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent.HtmlRootComp Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent.QuiescenceTask.get -> System.Threading.Tasks.Task! Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent.ToHtmlString() -> string! Microsoft.AspNetCore.Components.Web.HtmlRendering.HtmlRootComponent.WriteHtmlTo(System.IO.TextWriter! output) -> void +Microsoft.AspNetCore.Components.Web.InteractiveAutoRenderMode +Microsoft.AspNetCore.Components.Web.InteractiveAutoRenderMode.InteractiveAutoRenderMode() -> void +Microsoft.AspNetCore.Components.Web.InteractiveAutoRenderMode.InteractiveAutoRenderMode(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.InteractiveAutoRenderMode.Prerender.get -> bool +Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode +Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode.InteractiveServerRenderMode() -> void +Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode.InteractiveServerRenderMode(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode.Prerender.get -> bool +Microsoft.AspNetCore.Components.Web.InteractiveWebAssemblyRenderMode +Microsoft.AspNetCore.Components.Web.InteractiveWebAssemblyRenderMode.InteractiveWebAssemblyRenderMode() -> void +Microsoft.AspNetCore.Components.Web.InteractiveWebAssemblyRenderMode.InteractiveWebAssemblyRenderMode(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.InteractiveWebAssemblyRenderMode.Prerender.get -> bool Microsoft.AspNetCore.Components.Web.RenderMode -Microsoft.AspNetCore.Components.Web.RenderModeAutoAttribute -Microsoft.AspNetCore.Components.Web.RenderModeAutoAttribute.RenderModeAutoAttribute() -> void -Microsoft.AspNetCore.Components.Web.RenderModeAutoAttribute.RenderModeAutoAttribute(bool prerender) -> void -Microsoft.AspNetCore.Components.Web.RenderModeServerAttribute -Microsoft.AspNetCore.Components.Web.RenderModeServerAttribute.RenderModeServerAttribute() -> void -Microsoft.AspNetCore.Components.Web.RenderModeServerAttribute.RenderModeServerAttribute(bool prerender) -> void -Microsoft.AspNetCore.Components.Web.RenderModeWebAssemblyAttribute -Microsoft.AspNetCore.Components.Web.RenderModeWebAssemblyAttribute.RenderModeWebAssemblyAttribute() -> void -Microsoft.AspNetCore.Components.Web.RenderModeWebAssemblyAttribute.RenderModeWebAssemblyAttribute(bool prerender) -> void -Microsoft.AspNetCore.Components.Web.ServerRenderMode -Microsoft.AspNetCore.Components.Web.ServerRenderMode.Prerender.get -> bool -Microsoft.AspNetCore.Components.Web.ServerRenderMode.ServerRenderMode() -> void -Microsoft.AspNetCore.Components.Web.ServerRenderMode.ServerRenderMode(bool prerender) -> void -Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode -Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode.Prerender.get -> bool -Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode.WebAssemblyRenderMode() -> void -Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode.WebAssemblyRenderMode(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveAutoAttribute +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveAutoAttribute.RenderModeInteractiveAutoAttribute() -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveAutoAttribute.RenderModeInteractiveAutoAttribute(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveServerAttribute +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveServerAttribute.RenderModeInteractiveServerAttribute() -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveServerAttribute.RenderModeInteractiveServerAttribute(bool prerender) -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveWebAssemblyAttribute +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveWebAssemblyAttribute.RenderModeInteractiveWebAssemblyAttribute() -> void +Microsoft.AspNetCore.Components.Web.RenderModeInteractiveWebAssemblyAttribute.RenderModeInteractiveWebAssemblyAttribute(bool prerender) -> void override Microsoft.AspNetCore.Components.Forms.Editor.OnParametersSet() -> void override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.Dispatcher.get -> Microsoft.AspNetCore.Components.Dispatcher! override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.HandleException(System.Exception! exception) -> void override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.UpdateDisplayAsync(in Microsoft.AspNetCore.Components.RenderTree.RenderBatch renderBatch) -> System.Threading.Tasks.Task! -override Microsoft.AspNetCore.Components.Web.RenderModeAutoAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! -override Microsoft.AspNetCore.Components.Web.RenderModeServerAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! -override Microsoft.AspNetCore.Components.Web.RenderModeWebAssemblyAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! +override Microsoft.AspNetCore.Components.Web.RenderModeInteractiveAutoAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! +override Microsoft.AspNetCore.Components.Web.RenderModeInteractiveServerAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! +override Microsoft.AspNetCore.Components.Web.RenderModeInteractiveWebAssemblyAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! static Microsoft.AspNetCore.Components.Forms.Mapping.SupplyParameterFromFormServiceCollectionExtensions.AddSupplyValueFromFormProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! serviceCollection) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.AspNetCore.Components.Web.RenderMode.Auto.get -> Microsoft.AspNetCore.Components.Web.AutoRenderMode! -static Microsoft.AspNetCore.Components.Web.RenderMode.Server.get -> Microsoft.AspNetCore.Components.Web.ServerRenderMode! -static Microsoft.AspNetCore.Components.Web.RenderMode.WebAssembly.get -> Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode! +static Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveAuto.get -> Microsoft.AspNetCore.Components.Web.InteractiveAutoRenderMode! +static Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveServer.get -> Microsoft.AspNetCore.Components.Web.InteractiveServerRenderMode! +static Microsoft.AspNetCore.Components.Web.RenderMode.InteractiveWebAssembly.get -> Microsoft.AspNetCore.Components.Web.InteractiveWebAssemblyRenderMode! virtual Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.RenderChildComponent(System.IO.TextWriter! output, ref Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame componentFrame) -> void virtual Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.WriteComponentHtml(int componentId, System.IO.TextWriter! output) -> void virtual Microsoft.AspNetCore.Components.RenderTree.WebRenderer.GetWebRendererId() -> int diff --git a/src/Components/Web/src/RenderMode/AutoRenderMode.cs b/src/Components/Web/src/RenderMode/InteractiveAutoRenderMode.cs similarity index 64% rename from src/Components/Web/src/RenderMode/AutoRenderMode.cs rename to src/Components/Web/src/RenderMode/InteractiveAutoRenderMode.cs index 5ff58281cf66..4368795c01dd 100644 --- a/src/Components/Web/src/RenderMode/AutoRenderMode.cs +++ b/src/Components/Web/src/RenderMode/InteractiveAutoRenderMode.cs @@ -4,22 +4,22 @@ namespace Microsoft.AspNetCore.Components.Web; /// -/// A indicating that the component's render mode should be determined automatically based on a policy. +/// A indicating that the component should be interactive, with its hosting platform determined automatically based on a policy. /// -public class AutoRenderMode : IComponentRenderMode +public class InteractiveAutoRenderMode : IComponentRenderMode { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public AutoRenderMode() : this(true) + public InteractiveAutoRenderMode() : this(true) { } /// - /// Constructs an instance of + /// Constructs an instance of /// /// A flag indicating whether the component should first prerender on the server. The default value is true. - public AutoRenderMode(bool prerender) + public InteractiveAutoRenderMode(bool prerender) { Prerender = prerender; } diff --git a/src/Components/Web/src/RenderMode/ServerRenderMode.cs b/src/Components/Web/src/RenderMode/InteractiveServerRenderMode.cs similarity index 71% rename from src/Components/Web/src/RenderMode/ServerRenderMode.cs rename to src/Components/Web/src/RenderMode/InteractiveServerRenderMode.cs index 2928be842e26..3b3fd1cd2ff9 100644 --- a/src/Components/Web/src/RenderMode/ServerRenderMode.cs +++ b/src/Components/Web/src/RenderMode/InteractiveServerRenderMode.cs @@ -6,20 +6,20 @@ namespace Microsoft.AspNetCore.Components.Web; /// /// A indicating that the component should be rendered interactively on the server using Blazor Server hosting. /// -public class ServerRenderMode : IComponentRenderMode +public class InteractiveServerRenderMode : IComponentRenderMode { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public ServerRenderMode() : this(true) + public InteractiveServerRenderMode() : this(true) { } /// - /// Constructs an instance of + /// Constructs an instance of /// /// A flag indicating whether the component should first prerender on the server. The default value is true. - public ServerRenderMode(bool prerender) + public InteractiveServerRenderMode(bool prerender) { Prerender = prerender; } diff --git a/src/Components/Web/src/RenderMode/WebAssemblyRenderMode.cs b/src/Components/Web/src/RenderMode/InteractiveWebAssemblyRenderMode.cs similarity index 63% rename from src/Components/Web/src/RenderMode/WebAssemblyRenderMode.cs rename to src/Components/Web/src/RenderMode/InteractiveWebAssemblyRenderMode.cs index d270a39e061b..5aedf3df8995 100644 --- a/src/Components/Web/src/RenderMode/WebAssemblyRenderMode.cs +++ b/src/Components/Web/src/RenderMode/InteractiveWebAssemblyRenderMode.cs @@ -4,22 +4,22 @@ namespace Microsoft.AspNetCore.Components.Web; /// -/// A indicating that the component should be rendered on the client using WebAssembly. +/// A indicating that the component should be rendered interactively on the client using WebAssembly. /// -public class WebAssemblyRenderMode : IComponentRenderMode +public class InteractiveWebAssemblyRenderMode : IComponentRenderMode { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public WebAssemblyRenderMode() : this(true) + public InteractiveWebAssemblyRenderMode() : this(true) { } /// - /// Constructs an instance of + /// Constructs an instance of /// /// A flag indicating whether the component should first prerender on the server. The default value is true. - public WebAssemblyRenderMode(bool prerender) + public InteractiveWebAssemblyRenderMode(bool prerender) { Prerender = prerender; } diff --git a/src/Components/Web/src/RenderMode/RenderMode.cs b/src/Components/Web/src/RenderMode/RenderMode.cs index dcb53491d565..eed3219eb520 100644 --- a/src/Components/Web/src/RenderMode/RenderMode.cs +++ b/src/Components/Web/src/RenderMode/RenderMode.cs @@ -12,16 +12,16 @@ public static class RenderMode /// Gets an that represents rendering interactively on the server via Blazor Server hosting /// with server-side prerendering. /// - public static ServerRenderMode Server { get; } = new(); + public static InteractiveServerRenderMode InteractiveServer { get; } = new(); /// /// Gets an that represents rendering interactively on the client via Blazor WebAssembly hosting /// with server-side prerendering. /// - public static WebAssemblyRenderMode WebAssembly { get; } = new(); + public static InteractiveWebAssemblyRenderMode InteractiveWebAssembly { get; } = new(); /// /// Gets an that means the render mode will be determined automatically based on a policy. /// - public static AutoRenderMode Auto { get; } = new(); + public static InteractiveAutoRenderMode InteractiveAuto { get; } = new(); } diff --git a/src/Components/Web/src/RenderMode/TemporaryRenderModeAttributes.cs b/src/Components/Web/src/RenderMode/TemporaryRenderModeAttributes.cs index 2f96d74a6bbb..4ca17cd802e3 100644 --- a/src/Components/Web/src/RenderMode/TemporaryRenderModeAttributes.cs +++ b/src/Components/Web/src/RenderMode/TemporaryRenderModeAttributes.cs @@ -7,22 +7,22 @@ namespace Microsoft.AspNetCore.Components.Web; /// Temporary attribute for indicating that a component should render interactively on the server. /// This will later be replaced by a @rendermode directive. /// -public class RenderModeServerAttribute : RenderModeAttribute +public class RenderModeInteractiveServerAttribute : RenderModeAttribute { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public RenderModeServerAttribute() : this(true) + public RenderModeInteractiveServerAttribute() : this(true) { } /// - /// Constructs an instance of . + /// Constructs an instance of . /// /// A flag indicating whether to prerender the component on the server. The default value is true. - public RenderModeServerAttribute(bool prerender) + public RenderModeInteractiveServerAttribute(bool prerender) { - Mode = new ServerRenderMode(prerender); + Mode = new InteractiveServerRenderMode(prerender); } /// @@ -33,22 +33,22 @@ public RenderModeServerAttribute(bool prerender) /// Temporary attribute for indicating that a component should render interactively using WebAssembly. /// This will later be replaced by a @rendermode directive. /// -public class RenderModeWebAssemblyAttribute : RenderModeAttribute +public class RenderModeInteractiveWebAssemblyAttribute : RenderModeAttribute { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public RenderModeWebAssemblyAttribute() : this(true) + public RenderModeInteractiveWebAssemblyAttribute() : this(true) { } /// - /// Constructs an instance of . + /// Constructs an instance of . /// /// A flag indicating whether to prerender the component on the server. The default value is true. - public RenderModeWebAssemblyAttribute(bool prerender) + public RenderModeInteractiveWebAssemblyAttribute(bool prerender) { - Mode = new WebAssemblyRenderMode(prerender); + Mode = new InteractiveWebAssemblyRenderMode(prerender); } /// @@ -60,22 +60,22 @@ public RenderModeWebAssemblyAttribute(bool prerender) /// a mode automatically determined. /// This will later be replaced by a @rendermode directive. /// -public class RenderModeAutoAttribute : RenderModeAttribute +public class RenderModeInteractiveAutoAttribute : RenderModeAttribute { /// - /// Constructs an instance of . + /// Constructs an instance of . /// - public RenderModeAutoAttribute() : this(true) + public RenderModeInteractiveAutoAttribute() : this(true) { } /// - /// Constructs an instance of . + /// Constructs an instance of . /// /// A flag indicating whether to prerender the component on the server. The default value is true. - public RenderModeAutoAttribute(bool prerender) + public RenderModeInteractiveAutoAttribute(bool prerender) { - Mode = new AutoRenderMode(prerender); + Mode = new InteractiveAutoRenderMode(prerender); } /// diff --git a/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.cs b/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.cs index da9dce4b3a4c..fdc27e415667 100644 --- a/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.cs +++ b/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.cs @@ -13,10 +13,10 @@ namespace Microsoft.AspNetCore.Builder; public static class WebAssemblyRazorComponentsEndpointConventionBuilderExtensions { /// - /// Configures the for this application. + /// Configures the application to support the render mode. /// /// The . - public static RazorComponentsEndpointConventionBuilder AddWebAssemblyRenderMode( + public static RazorComponentsEndpointConventionBuilder AddInteractiveWebAssemblyRenderMode( this RazorComponentsEndpointConventionBuilder builder, Action? callback = null) { diff --git a/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRenderModeWithOptions.cs b/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRenderModeWithOptions.cs index ed279b4a360f..1a6650aaa0e1 100644 --- a/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRenderModeWithOptions.cs +++ b/src/Components/WebAssembly/Server/src/Builder/WebAssemblyRenderModeWithOptions.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Builder; -internal class WebAssemblyRenderModeWithOptions(WebAssemblyComponentsEndpointOptions? options) : WebAssemblyRenderMode +internal class WebAssemblyRenderModeWithOptions(WebAssemblyComponentsEndpointOptions? options) : InteractiveWebAssemblyRenderMode { public WebAssemblyComponentsEndpointOptions? EndpointOptions => options; } diff --git a/src/Components/WebAssembly/Server/src/PublicAPI.Unshipped.txt b/src/Components/WebAssembly/Server/src/PublicAPI.Unshipped.txt index e8258a29cb6f..fc6526979e03 100644 --- a/src/Components/WebAssembly/Server/src/PublicAPI.Unshipped.txt +++ b/src/Components/WebAssembly/Server/src/PublicAPI.Unshipped.txt @@ -6,5 +6,5 @@ Microsoft.AspNetCore.Components.WebAssembly.Server.WebAssemblyComponentsEndpoint Microsoft.AspNetCore.Components.WebAssembly.Server.WebAssemblyComponentsEndpointOptions.PathPrefix.set -> void Microsoft.AspNetCore.Components.WebAssembly.Server.WebAssemblyComponentsEndpointOptions.WebAssemblyComponentsEndpointOptions() -> void Microsoft.Extensions.DependencyInjection.WebAssemblyRazorComponentsBuilderExtensions -static Microsoft.AspNetCore.Builder.WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.AddWebAssemblyRenderMode(this Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! builder, System.Action? callback = null) -> Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! -static Microsoft.Extensions.DependencyInjection.WebAssemblyRazorComponentsBuilderExtensions.AddWebAssemblyComponents(this Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! builder) -> Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! +static Microsoft.AspNetCore.Builder.WebAssemblyRazorComponentsEndpointConventionBuilderExtensions.AddInteractiveWebAssemblyRenderMode(this Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! builder, System.Action? callback = null) -> Microsoft.AspNetCore.Builder.RazorComponentsEndpointConventionBuilder! +static Microsoft.Extensions.DependencyInjection.WebAssemblyRazorComponentsBuilderExtensions.AddInteractiveWebAssemblyComponents(this Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! builder) -> Microsoft.Extensions.DependencyInjection.IRazorComponentsBuilder! diff --git a/src/Components/WebAssembly/Server/src/WebAssemblyRazorComponentsBuilderExtensions.cs b/src/Components/WebAssembly/Server/src/WebAssemblyRazorComponentsBuilderExtensions.cs index b06a812c904f..4e780879c83b 100644 --- a/src/Components/WebAssembly/Server/src/WebAssemblyRazorComponentsBuilderExtensions.cs +++ b/src/Components/WebAssembly/Server/src/WebAssemblyRazorComponentsBuilderExtensions.cs @@ -21,7 +21,7 @@ public static class WebAssemblyRazorComponentsBuilderExtensions /// /// The . /// An that can be used to further customize the configuration. - public static IRazorComponentsBuilder AddWebAssemblyComponents(this IRazorComponentsBuilder builder) + public static IRazorComponentsBuilder AddInteractiveWebAssemblyComponents(this IRazorComponentsBuilder builder) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); @@ -36,9 +36,9 @@ public override IEnumerable GetEndpointBuilders(IComponent { if (renderMode is not WebAssemblyRenderModeWithOptions wasmWithOptions) { - if (renderMode is WebAssemblyRenderMode) + if (renderMode is InteractiveWebAssemblyRenderMode) { - throw new InvalidOperationException("Invalid render mode. Use AddWebAssemblyRenderMode(Action) to configure the WebAssembly render mode."); + throw new InvalidOperationException("Invalid render mode. Use AddInteractiveWebAssemblyRenderMode(Action) to configure the WebAssembly render mode."); } return Array.Empty(); @@ -62,7 +62,7 @@ public override IEnumerable GetEndpointBuilders(IComponent } public override bool Supports(IComponentRenderMode renderMode) - => renderMode is WebAssemblyRenderMode or AutoRenderMode; + => renderMode is InteractiveWebAssemblyRenderMode or InteractiveAutoRenderMode; private class EndpointRouteBuilder : IEndpointRouteBuilder { diff --git a/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs b/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs index 47565b9e07bf..29085088e69e 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs @@ -221,7 +221,7 @@ protected override void HandleException(Exception exception) protected override IComponent ResolveComponentForRenderMode([DynamicallyAccessedMembers(Component)] Type componentType, int? parentComponentId, IComponentActivator componentActivator, IComponentRenderMode renderMode) => renderMode switch { - WebAssemblyRenderMode or AutoRenderMode => componentActivator.CreateInstance(componentType), + InteractiveWebAssemblyRenderMode or InteractiveAutoRenderMode => componentActivator.CreateInstance(componentType), _ => throw new NotSupportedException($"Cannot create a component of type '{componentType}' because its render mode '{renderMode}' is not supported by WebAssembly rendering."), }; diff --git a/src/Components/test/testassets/Components.TestServer/BlazorWebServerStartup.cs b/src/Components/test/testassets/Components.TestServer/BlazorWebServerStartup.cs index 82ffef9a70e5..5deffb0d94b1 100644 --- a/src/Components/test/testassets/Components.TestServer/BlazorWebServerStartup.cs +++ b/src/Components/test/testassets/Components.TestServer/BlazorWebServerStartup.cs @@ -22,7 +22,7 @@ public BlazorWebServerStartup(IConfiguration configuration) public void ConfigureServices(IServiceCollection services) { services.AddRazorComponents() - .AddServerComponents(); + .AddInteractiveServerComponents(); // Since tests run in parallel, we use an ephemeral key provider to avoid filesystem // contention issues. @@ -44,7 +44,7 @@ public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env, app.UseEndpoints(endpoints => { endpoints.MapRazorComponents() - .AddServerRenderMode(); + .AddInteractiveServerRenderMode(); }); }); } diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs b/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs index 9faafea5b2d5..f2f69e00df34 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs +++ b/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs @@ -30,8 +30,8 @@ public void ConfigureServices(IServiceCollection services) options.MaxFormMappingRecursionDepth = 5; options.MaxFormMappingCollectionSize = 100; }) - .AddWebAssemblyComponents() - .AddServerComponents(); + .AddInteractiveWebAssemblyComponents() + .AddInteractiveServerComponents(); services.AddHttpContextAccessor(); services.AddSingleton(); services.AddCascadingAuthenticationState(); @@ -59,8 +59,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { endpoints.MapRazorComponents() .AddAdditionalAssemblies(Assembly.Load("Components.WasmMinimal")) - .AddServerRenderMode() - .AddWebAssemblyRenderMode(options => options.PathPrefix = "/WasmMinimal"); + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode(options => options.PathPrefix = "/WasmMinimal"); NotEnabledStreamingRenderingComponent.MapEndpoints(endpoints); StreamingRenderingForm.MapEndpoints(endpoints); diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/InteractiveStreamingRenderingComponent.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/InteractiveStreamingRenderingComponent.razor index e9d423e78f14..28ab8cd3690a 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/InteractiveStreamingRenderingComponent.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/InteractiveStreamingRenderingComponent.razor @@ -176,12 +176,12 @@ else { return renderMode switch { - RenderModeId.ServerPrerendered => RenderMode.Server, - RenderModeId.ServerNonPrerendered => new ServerRenderMode(false), - RenderModeId.WebAssemblyPrerendered => RenderMode.WebAssembly, - RenderModeId.WebAssemblyNonPrerendered => new WebAssemblyRenderMode(false), - RenderModeId.AutoPrerendered => RenderMode.Auto, - RenderModeId.AutoNonPrerendered => new AutoRenderMode(false), + RenderModeId.ServerPrerendered => RenderMode.InteractiveServer, + RenderModeId.ServerNonPrerendered => new InteractiveServerRenderMode(false), + RenderModeId.WebAssemblyPrerendered => RenderMode.InteractiveWebAssembly, + RenderModeId.WebAssemblyNonPrerendered => new InteractiveWebAssemblyRenderMode(false), + RenderModeId.AutoPrerendered => RenderMode.InteractiveAuto, + RenderModeId.AutoNonPrerendered => new InteractiveAutoRenderMode(false), _ => throw new InvalidOperationException($"Unknown render mode: {renderMode}"), }; } diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/ServerInteractiveCounter.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/ServerInteractiveCounter.razor index 7ca2b4b0468c..3c1cc95a98a7 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/ServerInteractiveCounter.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/ServerInteractiveCounter.razor @@ -1,4 +1,4 @@ -@attribute [RenderModeServer] +@attribute [RenderModeInteractiveServer] Server counter diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Auth/InteractiveAuthenticationState.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Auth/InteractiveAuthenticationState.razor index c4383dc6eb4e..9f1f897bea92 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Auth/InteractiveAuthenticationState.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Auth/InteractiveAuthenticationState.razor @@ -1,5 +1,5 @@ @page "/auth/interactive-authentication-state" -@attribute [RenderModeServer] +@attribute [RenderModeInteractiveServer] @inject NavigationManager Nav @using BasicTestApp.AuthTest diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/CallSiteInteractiveComponents.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/CallSiteInteractiveComponents.razor index 92fe608662c3..0bf9207bdd74 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/CallSiteInteractiveComponents.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/CallSiteInteractiveComponents.razor @@ -5,13 +5,13 @@ @if (ServerIncrementAmount.HasValue) { - +
} @if (WebAssemblyIncrementAmount.HasValue) { - +
} diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/EnhancedNav/PageWithInteractiveComponentsThatNavigate.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/EnhancedNav/PageWithInteractiveComponentsThatNavigate.razor index a16e927c4231..42709b0405d8 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/EnhancedNav/PageWithInteractiveComponentsThatNavigate.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/EnhancedNav/PageWithInteractiveComponentsThatNavigate.razor @@ -32,11 +32,11 @@ else { if (string.Equals("server", RenderMode, StringComparison.OrdinalIgnoreCase)) { - _renderMode = new ServerRenderMode(prerender: false); + _renderMode = new InteractiveServerRenderMode(prerender: false); } else if (string.Equals("webassembly", RenderMode, StringComparison.OrdinalIgnoreCase)) { - _renderMode = new WebAssemblyRenderMode(prerender: false); + _renderMode = new InteractiveWebAssemblyRenderMode(prerender: false); } } } diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Interactivity/VirtualizationTransitionToInteractivity.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Interactivity/VirtualizationTransitionToInteractivity.razor index aa5ec155812a..5c750517e43c 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Interactivity/VirtualizationTransitionToInteractivity.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Interactivity/VirtualizationTransitionToInteractivity.razor @@ -3,11 +3,11 @@

Server

- +

WebAssembly

- + @code { private readonly string[] _items = Enumerable.Range(1, 50) diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Rendering/LargeHtml.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Rendering/LargeHtml.razor index 435d7d150ad5..f201c2243509 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Rendering/LargeHtml.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/Rendering/LargeHtml.razor @@ -1,10 +1,10 @@ @page "/large-html-server"

WebAssembly with pre-rendering

- +

Server with pre-rendering

- +

Server without pre-rendering

- + diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Root.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Root.razor index dda0852a805a..2673a96e0858 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Root.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Root.razor @@ -9,7 +9,7 @@ - + diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Counter.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Counter.razor index 8e77f9844411..2b7d39f349f2 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Counter.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Counter.razor @@ -1,12 +1,7 @@ @page "/counter" -@*#if (UseWebAssembly) --> - - - - - -##else -@attribute [RenderModeServer] +@*#if (!InteractiveAtRoot) --> +@attribute [RenderModeInteractiveServer] +##endif*@ Counter @@ -24,4 +19,3 @@ currentCount++; } } -##endif*@ diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Weather.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Weather.razor index 12a9986a8359..ccf7be47ec3e 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Weather.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Pages/Weather.razor @@ -1,11 +1,13 @@ @page "/weather" +@*#if (!InteractiveAtRoot) --> @attribute [StreamRendering(true)] +##endif*@ Weather

Weather

-

This component demonstrates showing data from the server.

+

This component demonstrates showing data.

@if (forecasts == null) { @@ -41,7 +43,11 @@ else protected override async Task OnInitializedAsync() { +@*#if (InteractiveAtRoot) --> + // Simulate asynchronous loading to demonstrate a loading indicator +##else // Simulate asynchronous loading to demonstrate streaming rendering +##endif*@ await Task.Delay(500); var startDate = DateOnly.FromDateTime(DateTime.Now); diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Routes.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Routes.razor index caaf8602c6fd..25a5e5887bfe 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Routes.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/Routes.razor @@ -1,7 +1,7 @@ -@*#if (UseWebAssembly) --> - +@*#if (UseWebAssembly && !InteractiveAtRoot) + ##else - + ##endif*@ diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/_Imports.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/_Imports.razor index 1d7133e50d9a..68ab14b7c1e6 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/_Imports.razor +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Components/_Imports.razor @@ -6,4 +6,7 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using BlazorWeb_CSharp +@*#if (UseWebAssembly) --> +@using BlazorWeb_CSharp.Client +##endif*@ @using BlazorWeb_CSharp.Components diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.Main.cs index ee561e30092c..c241a8dd7610 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.Main.cs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.Main.cs @@ -1,4 +1,6 @@ - +#if (UseWebAssembly) +using BlazorWeb_CSharp.Client.Pages; +#endif using BlazorWeb_CSharp.Components; namespace BlazorWeb_CSharp; @@ -15,12 +17,12 @@ public static void Main(string[] args) #else builder.Services.AddRazorComponents() #if (UseServer && UseWebAssembly) - .AddServerComponents() - .AddWebAssemblyComponents(); + .AddInteractiveServerComponents() + .AddInteractiveWebAssemblyComponents(); #elif(UseServer) - .AddServerComponents(); + .AddInteractiveServerComponents(); #elif(UseWebAssembly) - .AddWebAssemblyComponents(); + .AddInteractiveWebAssemblyComponents(); #endif #endif @@ -52,14 +54,16 @@ public static void Main(string[] args) #if (UseServer && UseWebAssembly) app.MapRazorComponents() - .AddServerRenderMode() - .AddWebAssemblyRenderMode(); + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Counter).Assembly); #elif (UseServer) app.MapRazorComponents() - .AddServerRenderMode(); + .AddInteractiveServerRenderMode(); #elif (UseWebAssembly) app.MapRazorComponents() - .AddWebAssemblyRenderMode(); + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Counter).Assembly); #else app.MapRazorComponents(); #endif diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.cs index b292ab166695..5470d2ce484d 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.cs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/Program.cs @@ -1,3 +1,6 @@ +#if (UseWebAssembly) +using BlazorWeb_CSharp.Client.Pages; +#endif using BlazorWeb_CSharp.Components; var builder = WebApplication.CreateBuilder(args); @@ -8,12 +11,12 @@ #else builder.Services.AddRazorComponents() #if (UseServer && UseWebAssembly) - .AddServerComponents() - .AddWebAssemblyComponents(); + .AddInteractiveServerComponents() + .AddInteractiveWebAssemblyComponents(); #elif(UseServer) - .AddServerComponents(); + .AddInteractiveServerComponents(); #elif(UseWebAssembly) - .AddWebAssemblyComponents(); + .AddInteractiveWebAssemblyComponents(); #endif #endif @@ -45,14 +48,16 @@ #if (UseServer && UseWebAssembly) app.MapRazorComponents() - .AddServerRenderMode() - .AddWebAssemblyRenderMode(); + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Counter).Assembly); #elif (UseServer) app.MapRazorComponents() - .AddServerRenderMode(); + .AddInteractiveServerRenderMode(); #elif (UseWebAssembly) app.MapRazorComponents() - .AddWebAssemblyRenderMode(); + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(Counter).Assembly); #else app.MapRazorComponents(); #endif diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/wwwroot/app.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/wwwroot/app.css index 6e447a78f503..6aa275650f20 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/wwwroot/app.css +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorWeb-CSharp/BlazorWeb-CSharp/wwwroot/app.css @@ -3,10 +3,6 @@ html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } -h1:focus { - outline: none; -} - a, .btn-link { color: #0071c1; } @@ -26,6 +22,10 @@ a, .btn-link { } /*#endif*/ +h1:focus { + outline: none; +} + .valid.modified:not([type=checkbox]) { outline: 1px solid #26b050; } diff --git a/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWebTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWebTemplateTest.cs index 4a33d57d93c9..31b79308c7f5 100644 --- a/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWebTemplateTest.cs +++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWebTemplateTest.cs @@ -69,7 +69,7 @@ public async Task BlazorWebTemplate_NoAuth(string[] args) } }; - if (args.Contains(ArgConstants.UseServer)) + if (!args.Contains(ArgConstants.NoInteractivity)) { pages.Add(new Page { @@ -102,10 +102,10 @@ public async Task BlazorWebTemplate_NoAuth(string[] args) new[] { ArgConstants.UseProgramMain }, new[] { ArgConstants.NoHttps }, new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps }, - new[] { ArgConstants.UseServer }, - new[] { ArgConstants.UseServer, ArgConstants.UseProgramMain }, - new[] { ArgConstants.UseServer, ArgConstants.NoHttps }, - new[] { ArgConstants.UseServer, ArgConstants.UseProgramMain, ArgConstants.NoHttps } + new[] { ArgConstants.NoInteractivity }, + new[] { ArgConstants.NoInteractivity, ArgConstants.UseProgramMain }, + new[] { ArgConstants.NoInteractivity, ArgConstants.NoHttps }, + new[] { ArgConstants.NoInteractivity, ArgConstants.UseProgramMain, ArgConstants.NoHttps } }; private string ReadFile(string basePath, string path) diff --git a/src/ProjectTemplates/test/Templates.Tests/template-baselines.json b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json index 030ce2f80017..6b982d80f7b2 100644 --- a/src/ProjectTemplates/test/Templates.Tests/template-baselines.json +++ b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json @@ -506,7 +506,7 @@ "blazor": { "NoInteractivity": { "Template": "blazor", - "Arguments": "new blazor --use-server false", + "Arguments": "new blazor --interactivity none", "Files": [ "appsettings.Development.json", "appsettings.json", @@ -556,8 +556,8 @@ "AuthOption": "None" }, "UseWebAssembly": { - "Template": "web", - "Arguments": "new blazor --use-server false --use-wasm", + "Template": "blazor", + "Arguments": "new blazor --interactivity webassembly", "Files": [ "{ProjectName}.sln", "{ProjectName}/appsettings.Development.json", @@ -571,7 +571,6 @@ "{ProjectName}/Components/Layout/MainLayout.razor.css", "{ProjectName}/Components/Layout/NavMenu.razor", "{ProjectName}/Components/Layout/NavMenu.razor.css", - "{ProjectName}/Components/Pages/Counter.razor", "{ProjectName}/Components/Pages/Home.razor", "{ProjectName}/Components/Pages/Weather.razor", "{ProjectName}/Properties/launchSettings.json", @@ -589,8 +588,8 @@ "AuthOption": "None" }, "UseServerAndWebAssembly": { - "Template": "web", - "Arguments": "new blazor --use-wasm", + "Template": "blazor", + "Arguments": "new blazor --interactivity auto", "Files": [ "{ProjectName}.sln", "{ProjectName}/appsettings.Development.json", @@ -604,7 +603,6 @@ "{ProjectName}/Components/Layout/MainLayout.razor.css", "{ProjectName}/Components/Layout/NavMenu.razor", "{ProjectName}/Components/Layout/NavMenu.razor.css", - "{ProjectName}/Components/Pages/Counter.razor", "{ProjectName}/Components/Pages/Home.razor", "{ProjectName}/Components/Pages/Weather.razor", "{ProjectName}/Properties/launchSettings.json", @@ -621,9 +619,99 @@ ], "AuthOption": "None" }, + "UseServerInteractiveAtRoot": { + "Template": "blazor", + "Arguments": "new blazor --all-interactive", + "Files": [ + "appsettings.Development.json", + "appsettings.json", + "Components/App.razor", + "Components/Layout/MainLayout.razor", + "Components/Layout/MainLayout.razor.css", + "Components/Layout/NavMenu.razor", + "Components/Layout/NavMenu.razor.css", + "Components/Pages/Counter.razor", + "Components/Pages/Home.razor", + "Components/Pages/Weather.razor", + "Components/Routes.razor", + "Components/_Imports.razor", + "Program.cs", + "Properties/launchSettings.json", + "{ProjectName}.csproj", + "wwwroot/app.css", + "wwwroot/bootstrap/bootstrap.min.css", + "wwwroot/bootstrap/bootstrap.min.css.map", + "wwwroot/favicon.png" + ], + "AuthOption": "None" + }, + "UseWebAssemblyInteractiveAtRoot": { + "Template": "blazor", + "Arguments": "new blazor --interactivity webassembly --all-interactive", + "Files": [ + "{ProjectName}/appsettings.Development.json", + "{ProjectName}/appsettings.json", + "{ProjectName}/Components/App.razor", + "{ProjectName}/Components/_Imports.razor", + "{ProjectName}/Program.cs", + "{ProjectName}/Properties/launchSettings.json", + "{ProjectName}/{ProjectName}.csproj", + "{ProjectName}/wwwroot/app.css", + "{ProjectName}/wwwroot/bootstrap/bootstrap.min.css", + "{ProjectName}/wwwroot/bootstrap/bootstrap.min.css.map", + "{ProjectName}/wwwroot/favicon.png", + "{ProjectName}.Client/Layout/MainLayout.razor", + "{ProjectName}.Client/Layout/MainLayout.razor.css", + "{ProjectName}.Client/Layout/NavMenu.razor", + "{ProjectName}.Client/Layout/NavMenu.razor.css", + "{ProjectName}.Client/Pages/Counter.razor", + "{ProjectName}.Client/Pages/Home.razor", + "{ProjectName}.Client/Pages/Weather.razor", + "{ProjectName}.Client/Program.cs", + "{ProjectName}.Client/Routes.razor", + "{ProjectName}.Client/{ProjectName}.Client.csproj", + "{ProjectName}.Client/wwwroot/appsettings.Development.json", + "{ProjectName}.Client/wwwroot/appsettings.json", + "{ProjectName}.Client/_Imports.razor", + "{ProjectName}.sln" + ], + "AuthOption": "None" + }, + "UseServerAndWebAssemblyInteractiveAtRoot": { + "Template": "blazor", + "Arguments": "new blazor --interactivity auto --all-interactive", + "Files": [ + "{ProjectName}/appsettings.Development.json", + "{ProjectName}/appsettings.json", + "{ProjectName}/Components/App.razor", + "{ProjectName}/Components/_Imports.razor", + "{ProjectName}/Program.cs", + "{ProjectName}/Properties/launchSettings.json", + "{ProjectName}/{ProjectName}.csproj", + "{ProjectName}/wwwroot/app.css", + "{ProjectName}/wwwroot/bootstrap/bootstrap.min.css", + "{ProjectName}/wwwroot/bootstrap/bootstrap.min.css.map", + "{ProjectName}/wwwroot/favicon.png", + "{ProjectName}.Client/Layout/MainLayout.razor", + "{ProjectName}.Client/Layout/MainLayout.razor.css", + "{ProjectName}.Client/Layout/NavMenu.razor", + "{ProjectName}.Client/Layout/NavMenu.razor.css", + "{ProjectName}.Client/Pages/Counter.razor", + "{ProjectName}.Client/Pages/Home.razor", + "{ProjectName}.Client/Pages/Weather.razor", + "{ProjectName}.Client/Program.cs", + "{ProjectName}.Client/Routes.razor", + "{ProjectName}.Client/{ProjectName}.Client.csproj", + "{ProjectName}.Client/wwwroot/appsettings.Development.json", + "{ProjectName}.Client/wwwroot/appsettings.json", + "{ProjectName}.Client/_Imports.razor", + "{ProjectName}.sln" + ], + "AuthOption": "None" + }, "EmptyNoInteractivity": { "Template": "blazor", - "Arguments": "new blazor --use-server false --empty", + "Arguments": "new blazor --interactivity none --empty", "Files": [ "appsettings.Development.json", "appsettings.json", @@ -660,8 +748,8 @@ "AuthOption": "None" }, "EmptyUseWebAssembly": { - "Template": "web", - "Arguments": "new blazor --use-server false --use-wasm --empty", + "Template": "blazor", + "Arguments": "new blazor --interactivity webassembly --empty", "Files": [ "{ProjectName}.sln", "{ProjectName}/appsettings.Development.json", @@ -683,8 +771,8 @@ "AuthOption": "None" }, "EmptyUseServerAndWebAssembly": { - "Template": "web", - "Arguments": "new blazor --use-wasm --empty", + "Template": "blazor", + "Arguments": "new blazor --interactivity auto --empty", "Files": [ "{ProjectName}.sln", "{ProjectName}/appsettings.Development.json",