diff --git a/.github/copilot-issue-verification-action-plan.md b/.github/agents/issue-triage.agent.md similarity index 100% rename from .github/copilot-issue-verification-action-plan.md rename to .github/agents/issue-triage.agent.md diff --git a/aspnetcore/blazor/call-web-api.md b/aspnetcore/blazor/call-web-api.md index 5c98924ddda3..3215eb6ee17e 100644 --- a/aspnetcore/blazor/call-web-api.md +++ b/aspnetcore/blazor/call-web-api.md @@ -57,7 +57,12 @@ Example: In the app's `Program` file, call: - + * : Enables token acquisition to call web APIs. * `AddDownstreamApi`: Microsoft Identity Web packages provide API to create a named downstream web service for making web API calls. is injected into a server-side class, which is used to call to obtain weather data from an external web API (`MinimalApiJwt` project). @@ -194,7 +199,7 @@ builder.Services.AddDataProtection() `{KEY IDENTIFIER}`: Azure Key Vault key identifier used for key encryption. An access policy allows the application to access the key vault with `Get`, `Unwrap Key`, and `Wrap Key` permissions. The key identifier is obtained from the key in the Entra or Azure portal after it's created. If you enable autorotation of the key vault key, make sure that you use a versionless key identifier in the app's key vault configuration, where no key GUID is placed at the end of the identifier (example: `https://contoso.vault.azure.net/keys/data-protection`). > [!NOTE] -> In non-Production environments, the preceding example uses to simplify authentication while developing apps that deploy to Azure by combining credentials used in Azure hosting environments with credentials used in local development. When moving to production, an alternative is a better choice, such as the shown in the preceding example. For more information, see [Authenticate Azure-hosted .NET apps to Azure resources using a system-assigned managed identity](/dotnet/azure/sdk/authentication/system-assigned-managed-identity). +> In non-`Production` environments, the preceding example uses to simplify authentication while developing apps that deploy to Azure by combining credentials used in Azure hosting environments with credentials used in local development. When moving to production, an alternative is a better choice, such as the shown in the preceding example. For more information, see [Authenticate Azure-hosted .NET apps to Azure resources using a system-assigned managed identity](/dotnet/azure/sdk/authentication/system-assigned-managed-identity). Inject and call when calling on behalf of a user: diff --git a/aspnetcore/blazor/components/data-binding.md b/aspnetcore/blazor/components/data-binding.md index 2e63b53a6f8e..3c39220ad8d0 100644 --- a/aspnetcore/blazor/components/data-binding.md +++ b/aspnetcore/blazor/components/data-binding.md @@ -221,16 +221,38 @@ Additional examples For more information on the `InputText` component, see . -Components support two-way data binding by defining a pair of `@bind` attributes with either a `:get` or `:set` modifier . The `{PARAMETER}` placeholder in the following examples is used to bind a component parameter: +Components support two-way data binding by defining a pair of `@bind` attributes with either a `:get` or `:set` modifier. The `{PARAMETER}` placeholder in the following examples is used to bind a component parameter: * `@bind:get`/`@bind-{PARAMETER}:get`: Specifies the value to bind. * `@bind:set`/`@bind-{PARAMETER}:set`: Specifies a callback for when the value changes. -The `:get` and `:set` modifiers are always used together. +The `:get`/`:set` modifiers are always used together. -With `:get`/`:set` binding, you can react to a value change before it's applied to the DOM, and you can change the applied value, if necessary. Whereas with `@bind:event="{EVENT}"` attribute binding, where the `{EVENT}` placeholder is a DOM event, you receive the notification after the DOM is updated, and there's no capacity to modify the applied value while binding. +For binding to HTML elements, use `:get`/`:set` modifiers to ensure an `` element stays synchronized with a bound value, even when the value is modified in the handler: -The following `BindGetSet` component demonstrates `@bind:get`/`@bind:set` syntax for `` elements and the [`InputText` component](xref:blazor/forms/input-components) used by [Blazor forms](xref:blazor/forms/index) in synchronous (`Set`) and asynchronous (`SetAsync`) scenarios. +```razor + +``` + +> [!NOTE] +> The legacy approach prior to the release of .NET 7 used the `value` attribute with `@onchange`: +> +> ```razor +> +> ``` +> +> The preceding approach can cause synchronization errors, where the `` element displays a different value than the value held in the bound variable. Migrate to `:get`/`:set` modifiers to avoid this issue. + +For component parameters, the following syntaxes for a hypothetical `Child` component are functionally equivalent: + +```razor + + +``` + +With `:get`/`:set` modifier binding, you can react to a value change before it's applied to the DOM, and you can change the applied value, if necessary. Whereas with `@bind:event="{EVENT}"` attribute binding, where the `{EVENT}` placeholder is a DOM event, you receive the notification after the DOM is updated, and there's no capacity to modify the applied value while binding. + +The following `BindGetSet` component demonstrates `:get`/`:set` syntax for `` elements and the [`InputText` component](xref:blazor/forms/input-components) used by [Blazor forms](xref:blazor/forms/index) in synchronous (`Set`) and asynchronous (`SetAsync`) scenarios. `BindGetSet.razor`: @@ -270,7 +292,7 @@ The following `BindGetSet` component demonstrates `@bind:get`/`@bind:set` syntax For more information on the `InputText` component, see . -For another example use of `@bind:get` and `@bind:set`, see the [Bind across more than two components](#bind-across-more-than-two-components) section later in this article. +For another example use of `:get` and `:set` modifiers, see the [Bind across more than two components](#bind-across-more-than-two-components) section later in this article. Razor attribute binding is case-sensitive: @@ -279,7 +301,7 @@ Razor attribute binding is case-sensitive: ## Use `@bind:get`/`@bind:set` modifiers and avoid event handlers for two-way data binding -Two-way data binding isn't possible to implement with an event handler. Use `@bind:get`/`@bind:set` modifiers for two-way data binding. +Two-way data binding isn't possible to implement with an event handler. Use `:get`/`:set` modifiers for two-way data binding. Consider the following ***dysfunctional approach*** for two-way data binding using an event handler: @@ -306,9 +328,9 @@ Two-way data binding isn't possible to implement with an event handler. Use `@bi The `OnInput` event handler updates the value of `inputValue` to `Long!` after a fourth character is provided. However, the user can continue adding characters to the element value in the UI. The value of `inputValue` isn't bound back to the element's value with each keystroke. The preceding example is only capable of one-way data binding. -The reason for this behavior is that Blazor isn't aware that your code intends to modify the value of `inputValue` in the event handler. Blazor doesn't try to force DOM element values and .NET variable values to match unless they're bound with `@bind` syntax. In earlier versions of Blazor, two-way data binding is implemented by [binding the element to a property and controlling the property's value with its setter](#binding-to-a-property-with-c-get-and-set-accessors). In ASP.NET Core in .NET 7 or later, `@bind:get`/`@bind:set` modifier syntax is used to implement two-way data binding, as the next example demonstrates. +The reason for this behavior is that Blazor isn't aware that your code intends to modify the value of `inputValue` in the event handler. Blazor doesn't try to force DOM element values and .NET variable values to match unless they're bound with `@bind` syntax. In earlier versions of Blazor, two-way data binding is implemented by [binding the element to a property and controlling the property's value with its setter](#binding-to-a-property-with-c-get-and-set-accessors). In ASP.NET Core in .NET 7 or later, `:get`/`:set` modifier syntax is used to implement two-way data binding, as the next example demonstrates. - Consider the following ***correct approach*** using `@bind:get`/`@bind:set` for two-way data binding: + Consider the following ***correct approach*** using `:get`/`:set` for two-way data binding: ```razor

@@ -331,7 +353,7 @@ The reason for this behavior is that Blazor isn't aware that your code intends t } ``` -Using `@bind:get`/`@bind:set` modifiers both controls the underlying value of `inputValue` via `@bind:set` and binds the value of `inputValue` to the element's value via `@bind:get`. The preceding example demonstrates the correct approach for implementing two-way data binding. +Using `:get`/`:set` modifiers both controls the underlying value of `inputValue` via `:set` and binds the value of `inputValue` to the element's value via `:get`. The preceding example demonstrates the correct approach for implementing two-way data binding. :::moniker-end diff --git a/aspnetcore/blazor/components/quickgrid.md b/aspnetcore/blazor/components/quickgrid.md index 103ed107b641..a3b1b4fe1339 100644 --- a/aspnetcore/blazor/components/quickgrid.md +++ b/aspnetcore/blazor/components/quickgrid.md @@ -477,7 +477,7 @@ With the **Add New Scaffold Item** dialog open to **Installed** > **Common** > * Complete the **Add Razor Components using Entity Framework (CRUD)** dialog: - - -The following example demonstrates customer orders with the improved form validation (details omitted for brevity): +The following example demonstrates customer orders with nested collection form validation. In `Program.cs`, call on the service collection: @@ -1596,7 +1592,7 @@ In `Program.cs`, call component is present in the component. `OrderPage.razor`: @@ -1649,7 +1680,7 @@ In the following `OrderPage` component, the options that you can assign to the `Match` attribute of the `` element: +There are two options that you can assign to the attribute of the `` element: * : The is active when it matches the current URL, ignoring the query string and fragment. To include matching on the query string/fragment, use the `Microsoft.AspNetCore.Components.Routing.NavLink.EnableMatchAllForQueryStringAndFragment` [`AppContext` switch](/dotnet/fundamentals/runtime-libraries/system-appcontext) set to `true`. * (*default*): The is active when it matches any prefix of the current URL. - - -To adopt custom matching logic, subclass and override its `ShouldMatch` method. Return `true` from the method when you want to apply the `active` CSS class: +To adopt custom matching logic, subclass and override its method. Return `true` from the method when you want to apply the `active` CSS class: ```csharp public class CustomNavLink : NavLink @@ -73,7 +71,7 @@ public class CustomNavLink : NavLink :::moniker range="< aspnetcore-10.0" -There are two options that you can assign to the `Match` attribute of the `` element: +There are two options that you can assign to the attribute of the `` element: * : The is active when it matches the entire current URL, including the query string and fragment. * (*default*): The is active when it matches any prefix of the current URL. @@ -128,15 +126,13 @@ Use to manage URIs and :::moniker range=">= aspnetcore-10.0" - - Member | Description --- | --- | Gets the current absolute URI. | Gets the base URI (with a trailing slash) that can be prepended to relative URI paths to produce an absolute URI. Typically, corresponds to the `href` attribute on the document's `` element ([location of `` content](xref:blazor/project-structure#location-of-head-and-body-content)). | Navigates to the specified URI. If `forceLoad` is `false`:

  • And enhanced navigation is available at the current URL, Blazor's enhanced navigation is activated.
  • Otherwise, Blazor performs a full-page reload for the requested URL.
If `forceLoad` is `true`:
  • Client-side routing is bypassed.
  • The browser is forced to load the new page from the server, whether or not the URI is normally handled by the client-side interactive router.

For more information, see the [Enhanced navigation and form handling](#enhanced-navigation-and-form-handling) section.

If `replace` is `true`, the current URI in the browser history is replaced instead of pushing a new URI onto the history stack.

| An event that fires when the navigation location has changed. For more information, see the [Location changes](#location-changes) section. -`NotFound` | Called to handle scenarios where a requested resource isn't found. For more information, see the [Not Found responses](#not-found-responses) section. + | Called to handle scenarios where a requested resource isn't found. For more information, see the [Not Found responses](#not-found-responses) section. | Converts a relative URI into an absolute URI. | Based on the app's base URI, converts an absolute URI into a URI relative to the base URI prefix. For an example, see the [Produce a URI relative to the base URI prefix](#produce-a-uri-relative-to-the-base-uri-prefix) section. [`RegisterLocationChangingHandler`](#handleprevent-location-changes) | Registers a handler to process incoming navigation events. Calling always invokes the handler. @@ -275,34 +271,32 @@ You can use the `` MSBuild property set t ## Not Found responses - - - provides a `NotFound` method to handle scenarios where a requested resource isn't found during static server-side rendering (static SSR) or global interactive rendering: + handles scenarios where a requested resource isn't found during static server-side rendering (static SSR) or global interactive rendering: -* **Static SSR**: Calling `NavigationManager.NotFound` sets the HTTP status code to 404. +* **Static SSR**: Calling sets the HTTP status code to 404. * **Interactive rendering**: Signals the Blazor router ([`Router` component](xref:blazor/fundamentals/routing#route-templates)) to render Not Found content. * **Streaming rendering**: If [enhanced navigation](xref:blazor/fundamentals/routing?view=aspnetcore-10.0#enhanced-navigation-and-form-handling) is active, [streaming rendering](xref:blazor/components/rendering#streaming-rendering) renders Not Found content without reloading the page. When enhanced navigation is blocked, the framework redirects to Not Found content with a page refresh. > [!NOTE] -> The following discussion mentions that a Not Found Razor component can be assigned to the `Router` component's `NotFoundPage` parameter. The parameter works in concert with `NavigationManager.NotFound` and is described in more detail later in this section. +> The following discussion mentions that a Not Found Razor component can be assigned to the `Router` component's parameter. The parameter works in concert with and is described in more detail later in this section. -Streaming rendering can only render components that have a route, such as a `NotFoundPage` assignment (`NotFoundPage="..."`) or a [Status Code Pages Re-execution Middleware page assignment](xref:fundamentals/error-handling#usestatuscodepageswithreexecute) (). `DefaultNotFound` 404 content ("`Not found`" plain text) doesn't have a route, so it can't be used during streaming rendering. +Streaming rendering can only render components that have a route, such as a assignment (`NotFoundPage="..."`) or a [Status Code Pages Re-execution Middleware page assignment](xref:fundamentals/error-handling#usestatuscodepageswithreexecute) (). `DefaultNotFound` 404 content ("`Not found`" plain text) doesn't have a route, so it can't be used during streaming rendering. > [!NOTE] > The Not Found render fragment (`...`) isn't supported in .NET 10 or later. -`NavigationManager.NotFound` content rendering uses the following, regardless if the response has started or not (in order): + content rendering uses the following, regardless if the response has started or not (in order): * If is set, render the contents of the assigned page. -* If `Router.NotFoundPage` is set, render the assigned page. +* If is set, render the assigned page. * A Status Code Pages Re-execution Middleware page, if configured. * No action if none of the preceding approaches are adopted. [Status Code Pages Re-execution Middleware](xref:fundamentals/error-handling#usestatuscodepageswithreexecute) with takes precedence for browser-based address routing problems, such as an incorrect URL typed into the browser's address bar or selecting a link that has no endpoint in the app. -When a component is rendered statically (static SSR) and `NavigationManager.NotFound` is called, the 404 status code is set on the response: +When a component is rendered statically (static SSR) and is called, the 404 status code is set on the response: ```razor @page "/render-not-found-ssr" @@ -319,7 +313,7 @@ When a component is rendered statically (static SSR) and `NavigationManager.NotF To provide Not Found content for global interactive rendering, use a Not Found page (Razor component). > [!NOTE] -> The Blazor project template includes a `NotFound.razor` page. This page automatically renders whenever `NavigationManager.NotFound` is called, making it possible to handle missing routes with a consistent user experience. +> The Blazor project template includes a `NotFound.razor` page. This page automatically renders whenever is called, making it possible to handle missing routes with a consistent user experience. `Pages/NotFound.razor`: @@ -331,9 +325,9 @@ To provide Not Found content for global interactive rendering, use a Not Found p

Sorry, the content you are looking for does not exist.

``` -The `NotFound` component is assigned to the router's `NotFoundPage` parameter. `NotFoundPage` supports routing that can be used across Status Code Pages Re-execution Middleware, including non-Blazor middleware. +The `NotFound` component is assigned to , which supports routing that can be used across Status Code Pages Re-execution Middleware, including non-Blazor middleware. -In the following example, the preceding `NotFound` component is present in the app's `Pages` folder and passed to the `NotFoundPage` parameter: +In the following example, the preceding `NotFound` component is present in the app's `Pages` folder and passed to the parameter: ```razor @@ -344,7 +338,7 @@ In the following example, the preceding `NotFound` component is present in the a ``` -When a component is rendered with a global interactive render mode, calling `NavigationManager.NotFound` signals the Blazor router to render the `NotFound` component: +When a component is rendered with a global interactive render mode, calling signals the Blazor router to render the `NotFound` component: ```razor @page "/render-not-found-interactive" @@ -363,9 +357,9 @@ When a component is rendered with a global interactive render mode, calling `Nav } ``` -You can use the `OnNotFound` event for notifications when `NavigationManager.NotFound` is invoked. The event is only fired when `NavigationManager.NotFound` is called, not for any 404 response. For example, setting `HttpContextAccessor.HttpContext.Response.StatusCode` to `404` doesn't trigger `NavigationManager.NotFound`/`OnNotFound`. +Use the event for notifications when is invoked. The event is only fired when is called, not for any 404 response. For example, setting `HttpContextAccessor.HttpContext.Response.StatusCode` to `404` doesn't trigger /. -Apps that implement a custom router can also use `NavigationManager.NotFound`. The custom router can render Not Found content from two sources, depending on the state of the response: +Apps that implement a custom router can also use . The custom router can render Not Found content from two sources, depending on the state of the response: * Regardless of the response state, the re-execution path to the page can used by passing it to : @@ -409,7 +403,7 @@ Apps that implement a custom router can also use `NavigationManager.NotFound`. T } ``` -In the following example for components that adopt [interactive server-side rendering (interactive SSR)](xref:blazor/fundamentals/index#client-and-server-rendering-concepts), custom content is rendered depending on where `OnNotFound` is called. If the event is triggered by the following `Movie` component when a movie isn't found on component initialization, a custom message states that the requested movie isn't found. If the event is triggered by the `User` component in the following example, a different message states that the user isn't found. +In the following example for components that adopt [interactive server-side rendering (interactive SSR)](xref:blazor/fundamentals/index#client-and-server-rendering-concepts), custom content is rendered depending on where is called. If the event is triggered by the following `Movie` component when a movie isn't found on component initialization, a custom message states that the requested movie isn't found. If the event is triggered by the `User` component in the following example, a different message states that the user isn't found. The following `NotFoundContext` service manages the context and the message for when content isn't found by components. @@ -450,7 +444,7 @@ The `NotFound` page injects the `NotFoundContext` and displays the heading and m ``` -The `Routes` component (`Routes.razor`) sets the `NotFound` component as the Not Found page via the `NotFoundPage` parameter: +The `Routes` component (`Routes.razor`) sets the `NotFound` component as the Not Found page via the parameter: ```razor @@ -461,9 +455,9 @@ The `Routes` component (`Routes.razor`) sets the `NotFound` component as the Not In the following example components: * The `NotFoundContext` service is injected, along with the . -* In , `HandleNotFound` is an event handler assigned to the `OnNotFound` event. `HandleNotFound` calls `NotFoundContext.UpdateContext` to set a heading and message for Not Found content in the `NotFound` component. +* In , `HandleNotFound` is an event handler assigned to the event. `HandleNotFound` calls `NotFoundContext.UpdateContext` to set a heading and message for Not Found content in the `NotFound` component. * The components would normally use an ID from a route parameter to obtain a movie or user from a data store, such as a database. In the following examples, no entity is returned (`null`) to simulate what happens when an entity isn't found. -* When no entity is returned to , `NavigationManager.NotFound` is called, which in turn triggers the `OnNotFound` event and the `HandleNotFound` event handler. Not Found content is displayed by the router. +* When no entity is returned to , is called, which in turn triggers the event and the `HandleNotFound` event handler. Not Found content is displayed by the router. * The `HandleNotFound` method is unhooked on component disposal in . `Movie` component (`Movie.razor`): diff --git a/aspnetcore/blazor/fundamentals/routing.md b/aspnetcore/blazor/fundamentals/routing.md index da9128440bde..d2278e32f3d1 100644 --- a/aspnetcore/blazor/fundamentals/routing.md +++ b/aspnetcore/blazor/fundamentals/routing.md @@ -174,11 +174,9 @@ When the component navigat :::moniker range=">= aspnetcore-10.0" - +For requests where content isn't found, a Razor component can be assigned to . The parameter works in concert with [`NavigationManager.NotFound`](xref:blazor/fundamentals/navigation#not-found-responses), a method called in developer code that triggers a Not Found response. -For requests where content isn't found, a Razor component can be assigned to the `Router` component's `NotFoundPage` parameter. The parameter works in concert with `NavigationManager.NotFound`, a method called in developer code that triggers a Not Found response. `NavigationManager.NotFound` is described in the next article, . - -The Blazor project template includes a `NotFound.razor` page. This page automatically renders whenever `NavigationManager.NotFound` is called, making it possible to handle missing routes with a consistent user experience. +The Blazor project template includes a `NotFound.razor` page. This page automatically renders whenever is called, making it possible to handle missing routes with a consistent user experience. `NotFound.razor`: @@ -190,9 +188,9 @@ The Blazor project template includes a `NotFound.razor` page. This page automati

Sorry, the content you are looking for does not exist.

``` -The `NotFound` component is assigned to the router's `NotFoundPage` parameter. `NotFoundPage` supports routing that can be used across Status Code Pages Re-execution Middleware, including non-Blazor middleware. +The `NotFound` component is assigned to the router's parameter, which supports routing that can be used across Status Code Pages Re-execution Middleware, including non-Blazor middleware. -In the following example, the preceding `NotFound` component is present in the app's `Pages` folder and passed to the `NotFoundPage` parameter: +In the following example, the preceding `NotFound` component is present in the app's `Pages` folder and passed to the parameter: ```razor diff --git a/aspnetcore/blazor/host-and-deploy/webassembly/index.md b/aspnetcore/blazor/host-and-deploy/webassembly/index.md index 99388bc9879a..9cc6b6e09084 100644 --- a/aspnetcore/blazor/host-and-deploy/webassembly/index.md +++ b/aspnetcore/blazor/host-and-deploy/webassembly/index.md @@ -350,7 +350,7 @@ For configuration guidance, see the following resources: ## Host configuration values -[Blazor WebAssembly apps](xref:blazor/hosting-models#blazor-webassembly) can accept the following host configuration values as command-line arguments at runtime in the development environment. +[Blazor WebAssembly apps](xref:blazor/hosting-models#blazor-webassembly) can accept the following host configuration values as command-line arguments at runtime in the `Development` environment. ### Content root diff --git a/aspnetcore/blazor/progressive-web-app/index.md b/aspnetcore/blazor/progressive-web-app/index.md index f161d6340c13..be9ba3347dd7 100644 --- a/aspnetcore/blazor/progressive-web-app/index.md +++ b/aspnetcore/blazor/progressive-web-app/index.md @@ -336,17 +336,7 @@ The `AssetUrl` metadata specifies the base-relative URL that the browser should ## Push notifications -Like any other PWA, a Blazor WebAssembly PWA can receive push notifications from a backend server. The server can send push notifications at any time, even when the user isn't actively using the app. For example, push notifications can be sent when a different user performs a relevant action. - - +Like any other PWA, a Blazor WebAssembly PWA can receive push notifications from a backend server. The mechanism is independent of Blazor WebAssembly, and the server can send push notifications at any time, even when the user isn't actively using the app. For more information, see . ## Caveats for offline PWAs diff --git a/aspnetcore/blazor/progressive-web-app/push-notifications.md b/aspnetcore/blazor/progressive-web-app/push-notifications.md index 09375e5fbee1..0e6a3d1505da 100644 --- a/aspnetcore/blazor/progressive-web-app/push-notifications.md +++ b/aspnetcore/blazor/progressive-web-app/push-notifications.md @@ -256,7 +256,7 @@ Sending a notification involves performing some complex cryptographic operations The `SendNotificationAsync` method dispatches order notifications using the captured subscription. The following code makes uses of `WebPush` APIs for dispatching the notification. The payload of the notification is JSON serialized and includes a message and a URL. The message is displayed to the user, and the URL allows the user to reach the pizza order associated with the notification. Additional parameters can be serialized as required for other notification scenarios. > [!CAUTION] -> In the following example, we recommend using a secure approach for supplying the private key. When working locally in the Development environment, a private key can be provided to the app using the [Secret Manager](xref:security/app-secrets#secret-manager) tool. In Development, Staging, and Production environments, [Azure Key Vault](/azure/key-vault/) with [Azure Managed Identities](/entra/identity/managed-identities-azure-resources/overview) can be used, noting in passing that to obtain a certificate's private key from a key vault that the certificate must have an exportable private key. +> In the following example, we recommend using a secure approach for supplying the private key. When working locally in the `Development` environment, a private key can be provided to the app using the [Secret Manager](xref:security/app-secrets#secret-manager) tool. In `Development`, `Staging`, and `Production` environments, [Azure Key Vault](/azure/key-vault/) with [Azure Managed Identities](/entra/identity/managed-identities-azure-resources/overview) can be used, noting in passing that to obtain a certificate's private key from a key vault that the certificate must have an exportable private key. ```csharp private static async Task SendNotificationAsync(Order order, diff --git a/aspnetcore/blazor/project-structure.md b/aspnetcore/blazor/project-structure.md index 2cab0445524f..c6ed1bf2e8bc 100644 --- a/aspnetcore/blazor/project-structure.md +++ b/aspnetcore/blazor/project-structure.md @@ -63,21 +63,12 @@ The `Components` folder of the server project holds the app's server-side Razor The `Components/Pages` folder of the server project contains the app's routable server-side Razor components. The route for each page is specified using the [`@page`](xref:mvc/views/razor#page) directive. - - The `App` component (`App.razor`) is the root component of the app with HTML `` markup, the `Routes` component, and the Blazor `