diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000000..771ff1c44ddc --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,112 @@ +--- +author: wadepickett +ms.author: wpickett +ms.date: 07-31-2025 +--- + +# Copilot Instructions for `dotnet/AspNetCore.Docs` + +## Introduction +This document contains general and repository-specific instructions for GitHub Copilot when assisting with the `dotnet/AspNetCore.Docs` repository. **Unless otherwise specified, all ".NET" references refer to modern .NET, not .NET Framework.** + +## General Guidelines + +### Issue Handling +When creating a PR for an issue: +1. Read the full issue and all linked references +2. Study code samples from linked PRs that demonstrate features in the latest .NET pre-release version (e.g., .NET 10 Preview) to ensure that guidance and documentation reflect the latest upcoming changes and best practices. +3. For labeled issues that have the following labels, follow these guidelines: + - **new-feature:** State which version introduced the feature + - **bug:** Focus on correcting technical inaccuracies +4. When you're assigned an issue, after you've completed your work and the workflows (status checks) have run, ensure there are no build warnings under the OpenPublishing.Build status check. If there are, open the build report (under View Details) and resolve any build warnings you introduced. +5. Provide an overview of the project you're working on, including its purpose, goals, and any relevant background information. +6. Include the folder structure of the repository, including any important directories or files that are relevant to the project. + +### Markdown File Naming and Organization +- If you're adding a new Markdown file, it should be named in all lowercase with hyphens separating words. Also, omit any filler words such as "the" or "a" from the file name. + +### API References and Verification + - Use `` for API cross-references. + - The API documentation ID must be verified and sourced from the official XML documentation in dotnet-api-docs, never just infer API documentation IDs by looking for similar patterns. + - If you cannot verify, state that explicitly in your output. + +### Links and References +- Use relative links (for example, `../folder/file.md` or `./file.md`) when referencing files within this repository. Do not use absolute URLs or GitHub web links for internal content. +- For external links, always remove any language or culture segment from the URL path (such as `/en-us/`, `/fr-fr/`, `/en/`, etc.). + - Example (Microsoft Learn): + - Original: `https://learn.microsoft.com/en-us/aspnet/core/blazor/` + - Correct: `https://learn.microsoft.com/aspnet/core/blazor/` + - Example (Wikipedia): + - Original: `https://en.wikipedia.org/wiki/ASP.NET_Core` + - Correct: `https://wikipedia.org/wiki/ASP.NET_Core` +- For Microsoft Learn links, also strip the base domain (`https://learn.microsoft.com/en-us`) so only the path remains. + - Example: + - Original: `https://learn.microsoft.com/en-us/aspnet/core/blazor/` + - Correct: `/aspnet/core/blazor/` + +## Repository-Specific Guidelines +- Follow the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/) +- **Repository Exceptions**: + - Number ordered lists as "1." for every item (don't use sequential numbers) + - Use backticks around content specifically for file names (`file.txt`), folders (`folder`), file paths (`folder/file.txt`), custom types (`myVariable`, `MyClass`), raw URLs in the text (`https://www.contoso.com`), URL segments (`/product/id/199`), file extensions (`.razor`), NuGet packages (`Microsoft.AspNetCore.SignalR.Client`), and code that should never be localized + - For Blazor's Razor components mentioned in article text, use backticks around the name of the component (example: `Counter` component) + - For any new or updated .md file, ensure the standard frontmatter (metadata) is included as specified in [Metadata for Microsoft Learn documentation.](https://learn.microsoft.com/en-us/contribute/content/metadata) + - For any new or updated .md file added to the repository, ensure the following frontmatter (metadata) is included: + - Metadata `ai-usage: ai-assisted` if any AI assistance was used + - Place the title metadata first, followed by the remaining metadata lines in alphabetical order. Example: `title`, `author`, `description`, `monikerRange`, `ms.author`, `ms.custom`, `ms.date`, `uid`, `zone_pivot_groups` + - Metadata `ms.date: ` with a format of MM-DD-YYYY. If the file already has a `ms.date` metadata, update it to today's date if more than 50 characters are changed in the file. + +### Version Targeting Common Range Patterns +- Fixed Range: `>= aspnetcore-7.0 <= aspnetcore-9.0` +- Open Upper Bound: `>= aspnetcore-7.0` +- Open Lower Bound: `<= aspnetcore-9.0` +- Specific Version: `== aspnetcore-9.0` + +### Code Snippets +- For code snippets longer than 6 lines: + 1. Create a subfolder named after the document the snippet supports. + 1. Create a `snippets` folder inside that subfolder. + 1. For the code file: + - If the snippet is not version-specific, place the code in a file with the appropriate extension (for example, `.cs` for C#) in the `snippets` folder. + - If the snippet is version-specific: + 1. Create a subfolder inside the `snippets` folder named for the version (for example, `9.0` for .NET 9 or ASP.NET Core 9). + 1. Place the code in a file with the correct extension inside the version subfolder. + 1. Add a project file (`.csproj`) to the version subfolder targeting the matching .NET version, if necessary to run or build the snippet. +- Reference snippets using triple-colon syntax: + - **Use file-relative paths** for snippets located in the same file as the articles that refer to it. + ``` + :::code language="csharp" source="../snippets/my-doc/Program.cs"::: + ``` + - **Use repository root-relative paths** for shared snippets: + ``` + :::code language="csharp" source="~/tutorials/min-web-api/samples/9.x/todoGroup/TodoDb.cs"::: + ``` +- For longer snippets, highlight specific lines: + ``` + :::code language="csharp" source="~/path/to/file.cs" range="5-10" highlight="2-3"::: + ``` +- Use the latest, non-preview C# coding patterns in non-preview code examples +- Use the latest preview C# coding patterns in preview code examples +- Use the following language code and indentation standards for markdown code blocks or the `language` attribute of code snippets: + + Content of the snippet | Language code | Indentation in spaces + :---: | :---: | :---: + C# | csharp | 4 + HTML | html | 4 + CSS | css | 4 + JavaScript | javascript | 2 spaces (use 4 spaces for line continuation) + XML | xml | 2 + JSON | json | 2 + Console | console | 2 + Text | - | 2 + +### ASP.NET Core Specific Guidelines +- Use the latest supported version for examples unless otherwise specified +- Title and section header casing is sentence case (capitalize the first word and any proper nouns) +- For parts of a title or section header that normally use code style in article text (backticks around the content), also use code style in the title or section header (example H1 header: "# Modify the `Program.cs` file") +- Use code style for any words that shouldn't be localized +- For bullet lists, use an asterisk as the bullet marker +- Bullet lists should have two or more entries at the same level in the list. If there is only one item under a bullet, remove its bullet marker and roll that item into its parent bullet. +- Lead with Microsoft-recommended approaches +- Include differences between Minimal API and controller-based approaches when relevant +- For middleware content and examples, use the middleware class approach diff --git a/aspnetcore/blazor/components/data-binding.md b/aspnetcore/blazor/components/data-binding.md index 5738ffad3117..c6406458ebe6 100644 --- a/aspnetcore/blazor/components/data-binding.md +++ b/aspnetcore/blazor/components/data-binding.md @@ -4,7 +4,7 @@ author: guardrex description: Learn about data binding features for Razor components and DOM elements in Blazor apps. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 11/12/2024 uid: blazor/components/data-binding --- diff --git a/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md b/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md index 47aad82ca9cc..b2a44995c287 100644 --- a/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md +++ b/aspnetcore/blazor/javascript-interoperability/call-dotnet-from-javascript.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to invoke .NET methods from JavaScript functions in Blazor apps. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 12/17/2024 uid: blazor/js-interop/call-dotnet-from-javascript --- diff --git a/aspnetcore/blazor/javascript-interoperability/call-javascript-from-dotnet.md b/aspnetcore/blazor/javascript-interoperability/call-javascript-from-dotnet.md index 21ba5a8d1327..9cae8fdff679 100644 --- a/aspnetcore/blazor/javascript-interoperability/call-javascript-from-dotnet.md +++ b/aspnetcore/blazor/javascript-interoperability/call-javascript-from-dotnet.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to invoke JavaScript functions from .NET methods in Blazor apps. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 4/10/2024 uid: blazor/js-interop/call-javascript-from-dotnet --- diff --git a/aspnetcore/blazor/progressive-web-app/push-notifications.md b/aspnetcore/blazor/progressive-web-app/push-notifications.md index 53fd3672a3d8..a767e8f0f97f 100644 --- a/aspnetcore/blazor/progressive-web-app/push-notifications.md +++ b/aspnetcore/blazor/progressive-web-app/push-notifications.md @@ -1,11 +1,12 @@ --- title: Push notifications for ASP.NET Core Blazor Progressive Web Applications (PWAs) +ai-usage: ai-assisted author: guardrex description: Learn how to issue push notifications in Blazor Progressive Web Applications (PWAs). monikerRange: '>= aspnetcore-3.1' ms.author: wpickett ms.custom: mvc -ms.date: 07/07/2025 +ms.date: 07/30/2025 uid: blazor/progressive-web-app/push-notifications --- # Push notifications for ASP.NET Core Blazor Progressive Web Applications (PWAs) @@ -30,17 +31,6 @@ The example in this article uses push notifications to provide order status upda Generate the cryptographic public and private keys for securing push notifications either locally, for example with PowerShell or IIS, or using an online tool. -> [!CAUTION] -> This article's use of a unencrypted, insecure private key in the app's code ***is for demonstration purposes and local testing only.*** We recommend using a secure approach for supplying a private key to an ASP.NET Core app at all stages of development. 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. - - - Placeholders used in this article's example code: * `{PUBLIC KEY}`: The public key. @@ -48,6 +38,14 @@ Placeholders used in this article's example code: For this article's C# examples, update the `someone@example.com` email address to match the address used when creating the custom key pair. +When implementing push notifications, ensure that cryptographic keys are managed securely: + +* **Key generation**: Use a trusted library or tool to generate the public and private keys. Avoid using weak or outdated algorithms. +* **Key storage**: Store private keys securely on the server, using a secure storage mechanism such as a hardware security module (HSM) or encrypted storage. Never expose private keys to the client. +* **Key usage**: Use the private key only for signing push notification payloads. Ensure that the public key is distributed securely to clients. + +For more information on cryptographic best practices, see [Cryptographic Services](/dotnet/standard/security/cryptographic-services). + ## Create a subscription Before sending push notifications to a user, the app must ask the user for permission. If they grant permission to receive notifications, their browser generates a *subscription*, which includes a set of tokens the app can use to route notifications to the user. @@ -258,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] -> This article's use of a unencrypted, insecure private key in the app's code ***is for demonstration purposes and local testing only.*** We recommend using a secure approach for supplying a private key to an ASP.NET Core app at all stages of development. 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/security/blazor-web-app-with-entra.md b/aspnetcore/blazor/security/blazor-web-app-with-entra.md index 207a0bb77f4c..064013b3d1d5 100644 --- a/aspnetcore/blazor/security/blazor-web-app-with-entra.md +++ b/aspnetcore/blazor/security/blazor-web-app-with-entra.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to secure a Blazor Web App with Microsoft Entra ID. monikerRange: '>= aspnetcore-9.0' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 07/29/2025 uid: blazor/security/blazor-web-app-entra zone_pivot_groups: blazor-web-app-entra-specification diff --git a/aspnetcore/blazor/security/index.md b/aspnetcore/blazor/security/index.md index 2022b497d7c7..3d9c82042c88 100644 --- a/aspnetcore/blazor/security/index.md +++ b/aspnetcore/blazor/security/index.md @@ -535,13 +535,13 @@ Two additional abstractions participate in managing authentication state: * ([reference source](https://github.com/dotnet/aspnetcore/blob/main/src/Components/Server/src/Circuits/RevalidatingServerAuthenticationStateProvider.cs)): A base class for services used by the Blazor framework to receive an authentication state from the host environment and revalidate it at regular intervals. - The default 30 minute revalidation interval can be adjusted in [`RevalidatingIdentityAuthenticationStateProvider` (reference source)](https://github.com/dotnet/aspnetcore/blob/v7.0.0/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Areas/Identity/RevalidatingIdentityAuthenticationStateProvider.cs#L26). The following example shortens the interval to 20 minutes: +[!INCLUDE[](~/includes/aspnetcore-repo-ref-source-links.md)] - ```csharp - protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20); - ``` +In apps generated from the Blazor project template for .NET 8 or later, adjust the default 30 minute revalidation interval in `IdentityRevalidatingAuthenticationStateProvider`. Earlier than .NET 8, adjust the interval in `RevalidatingIdentityAuthenticationStateProvider`. The following example shortens the interval to 20 minutes: -[!INCLUDE[](~/includes/aspnetcore-repo-ref-source-links.md)] +```csharp +protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20); +``` ### Authentication state management at sign out diff --git a/aspnetcore/blazor/security/webassembly/index.md b/aspnetcore/blazor/security/webassembly/index.md index 1fe36f1789dd..5e5772d04700 100644 --- a/aspnetcore/blazor/security/webassembly/index.md +++ b/aspnetcore/blazor/security/webassembly/index.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to secure Blazor WebAssembly apps as single-page applications (SPAs). monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 11/12/2024 uid: blazor/security/webassembly/index --- diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md index ebdde4c0b9b9..9a9902c5eb1a 100644 --- a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md +++ b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-accounts.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone app with Microsoft Accounts. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 04/07/2025 uid: blazor/security/webassembly/standalone-with-microsoft-accounts --- diff --git a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md index 8b2b3c1601e0..850210dae7bd 100644 --- a/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md +++ b/aspnetcore/blazor/security/webassembly/standalone-with-microsoft-entra-id.md @@ -4,7 +4,7 @@ author: guardrex description: Learn how to secure an ASP.NET Core Blazor WebAssembly standalone app with Microsoft Entra ID. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: "devx-track-csharp, mvc" +ms.custom: devx-track-csharp, mvc, sfi-ropc-nochange ms.date: 04/07/2025 uid: blazor/security/webassembly/standalone-with-microsoft-entra-id --- diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md index e4ea174683b6..7e115d251ce7 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-6.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-6.md @@ -58,16 +58,36 @@ Change the `QuickGrid` component's movie.Title!.Contains(...)` code is a *lambda expression*. Lambdas are used in method-based LINQ queries as arguments to standard query operator methods such as the or methods. LINQ queries aren't executed when they're defined or when they're modified by calling a method, such as , , or . Rather, query execution is deferred. The evaluation of an expression is delayed until its realized value is iterated. -The method is run on the database, not in the C# code. The case sensitivity of the query depends on the database and the collation. For SQL Server, maps to [SQL `LIKE`](/sql/t-sql/language-elements/like-transact-sql), which is case insensitive. SQLite with default collation provides a mixture of case sensitive and case insensitive filtering, depending on the query. For information on making case insensitive SQLite queries, see the [Additional resources](#additional-resources) section of this article. +The method is run on the database, not in the C# code. The case sensitivity of the query depends on the database and the collation. For SQL Server, maps to [SQL `LIKE`](/sql/t-sql/language-elements/like-transact-sql), which is case insensitive. SQLite with default collation provides a mixture of case-sensitive and case-insensitive filtering, depending on the query. Run the app and navigate to the movies `Index` page at `/movies`. The movies in the database load: ![Mad Max movies before filtering in the movies Index page](~/blazor/tutorials/movie-database-app/part-6/_static/before-filtering.png) +:::zone pivot="vs" + Append a query string to the URL in the address bar: `?titleFilter=road+warrior`. For example, the full URL appears as `https://localhost:7073/movies?titleFilter=road+warrior`, assuming the port number is `7073`. The filtered movie is displayed: !['The Road Warrior' Mad Max movie filtered using a query string in the browser's address bar](~/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result.png) +:::zone-end + +:::zone pivot="vsc" + +Append a query string to the URL in the address bar: `?titleFilter=Road+Warrior`. For example, the full URL appears as `https://localhost:7073/movies?titleFilter=Road+Warrior`, assuming the port number is `7073`. The filtered movie is displayed: + +!['The Road Warrior' Mad Max movie filtered using a query string in the browser's address bar](~/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result-sqlite.png) + +:::zone-end + +:::zone pivot="cli" + +Append a query string to the URL in the address bar: `?titleFilter=Road+Warrior`. For example, the full URL appears as `https://localhost:7073/movies?titleFilter=Road+Warrior`, assuming the port number is `7073`. The filtered movie is displayed: + +!['The Road Warrior' Mad Max movie filtered using a query string in the browser's address bar](~/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result-sqlite.png) + +:::zone-end + Next, give users a way to provide the `titleFilter` filter string via the component's UI. Add the following HTML under the H1 heading (`

Index

`). The following HTML reloads the page with the contents of the textbox as a query string value: ```html @@ -99,6 +119,8 @@ Because the app is currently running with `dotnet watch`, saved changes are dete :::zone-end +:::zone pivot="vs" + Type "`road warrior`" into the search box and select the **:::no-loc text="Search":::** button to filter the movies: ![Mad Max movies before filtering in the movies Index page. The search field has the value 'road warrior'.](~/blazor/tutorials/movie-database-app/part-6/_static/form-filter.png) @@ -109,6 +131,36 @@ The result after searching on `road warrior`: Notice that the search box loses the search value ("`road warrior`") when the movies are filtered. If you want to preserve the searched value, add the `data-permanent` attribute: +:::zone-end + +:::zone pivot="vsc" + +Type "`Road Warrior`" into the search box and select the **:::no-loc text="Search":::** button to filter the movies: + +![Mad Max movies before filtering in the movies Index page. The search field has the value 'Road Warrior'.](~/blazor/tutorials/movie-database-app/part-6/_static/form-filter-sqlite.png) + +The result after searching on `Road Warrior`: + +!['The Road Warrior' Mad Max movie filtered using a GET request via an HTML form action](~/blazor/tutorials/movie-database-app/part-6/_static/form-filter-result-sqlite.png) + +Notice that the search box loses the search value ("`Road Warrior`") when the movies are filtered. If you want to preserve the searched value, add the `data-permanent` attribute: + +:::zone-end + +:::zone pivot="cli" + +Type "`Road Warrior`" into the search box and select the **:::no-loc text="Search":::** button to filter the movies: + +![Mad Max movies before filtering in the movies Index page. The search field has the value 'Road Warrior'.](~/blazor/tutorials/movie-database-app/part-6/_static/form-filter-sqlite.png) + +The result after searching on `Road Warrior`: + +!['The Road Warrior' Mad Max movie filtered using a GET request via an HTML form action](~/blazor/tutorials/movie-database-app/part-6/_static/form-filter-result-sqlite.png) + +Notice that the search box loses the search value ("`Road Warrior`") when the movies are filtered. If you want to preserve the searched value, add the `data-permanent` attribute: + +:::zone-end + ```diff -
+ @@ -143,10 +195,6 @@ Stop the app by closing the browser's window and pressing Ctrl+C * [LINQ documentation](/dotnet/csharp/programming-guide/concepts/linq/) * [Write C# LINQ queries to query data (C# documentation)](/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq) * [Lambda Expression (C# documentation](/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions) -* Case insensitive SQLite queries - * [How to use case-insensitive query with Sqlite provider? (`dotnet/efcore` #11414)](https://github.com/dotnet/efcore/issues/11414) - * [How to make a SQLite column case insensitive (`dotnet/AspNetCore.Docs` #22314)](https://github.com/dotnet/AspNetCore.Docs/issues/22314) - * [Collations and Case Sensitivity](/ef/core/miscellaneous/collations-and-case-sensitivity) ## Legal diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-result-sqlite.png b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-result-sqlite.png new file mode 100644 index 000000000000..7dd1f8ebfcf3 Binary files /dev/null and b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-result-sqlite.png differ diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-sqlite.png b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-sqlite.png new file mode 100644 index 000000000000..78dd631a911d Binary files /dev/null and b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/form-filter-sqlite.png differ diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result-sqlite.png b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result-sqlite.png new file mode 100644 index 000000000000..dec03e6645ea Binary files /dev/null and b/aspnetcore/blazor/tutorials/movie-database-app/part-6/_static/query-string-filter-result-sqlite.png differ diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md index aac9277d0d6d..5b509da0ce12 100644 --- a/aspnetcore/blazor/tutorials/movie-database-app/part-8.md +++ b/aspnetcore/blazor/tutorials/movie-database-app/part-8.md @@ -191,10 +191,30 @@ In its place, add the following Razor markup: `@bind:event="oninput"` performs binding for the HTML's `oninput` event, which fires when the `` element's value is changed as a direct result of a user typing in the search box. The QuickGrid is bound to `FilteredMovies`. As `titleFilter` changes with the value of the search box, rerendering the QuickGrid bound to the `FilteredMovies` method filters movie entities based on the updated value of `titleFilter`. +:::zone pivot="vs" + Run the app, type "`road warrior`" into the search field and notice how the QuickGrid is filtered for each character entered until *The Road Warrior* movie is left when the search field reaches "`road `" (":::no-loc text="road":::" followed by a space). ![Movie list filtered to 'The Road Warrior' movie when the search box reaches 'road ' ('road' followed by a space).](~/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior.png) +:::zone-end + +:::zone pivot="vsc" + +Run the app, type "`Road Warrior`" into the search field and notice how the QuickGrid is filtered for each character entered until *The Road Warrior* movie is left when the search field reaches "`Road `" (":::no-loc text="Road":::" followed by a space). + +![Movie list filtered to 'The Road Warrior' movie when the search box reaches 'Road ' ('Road' followed by a space).](~/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior-sqlite.png) + +:::zone-end + +:::zone pivot="cli" + +Run the app, type "`Road Warrior`" into the search field and notice how the QuickGrid is filtered for each character entered until *The Road Warrior* movie is left when the search field reaches "`Road `" (":::no-loc text="Road":::" followed by a space). + +![Movie list filtered to 'The Road Warrior' movie when the search box reaches 'Road ' ('Road' followed by a space).](~/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior-sqlite.png) + +:::zone-end + Filtering database records is performed on the server, and the server interactively sends back the HTML to display over the same SignalR connection. The page doesn't reload. The user feels like their interactions with the page are running code on the client. Actually, the code is running the server. Instead of an HTML form, submitting a GET request in this scenario could've also used JavaScript to submit the request to the server, either using the [Fetch API](https://developer.mozilla.org/docs/Web/API/Fetch_API)` or [XMLHttpRequest API](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest). In most cases, JavaScript can be replaced by using Blazor and C# in an interactive component. diff --git a/aspnetcore/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior-sqlite.png b/aspnetcore/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior-sqlite.png new file mode 100644 index 000000000000..440661fa12b5 Binary files /dev/null and b/aspnetcore/blazor/tutorials/movie-database-app/part-8/_static/filtered-to-road-warrior-sqlite.png differ diff --git a/aspnetcore/data/ef-mvc/complex-data-model.md b/aspnetcore/data/ef-mvc/complex-data-model.md index c4aba444c165..3240a57a42e5 100644 --- a/aspnetcore/data/ef-mvc/complex-data-model.md +++ b/aspnetcore/data/ef-mvc/complex-data-model.md @@ -3,7 +3,7 @@ title: "Tutorial: Create a complex data model - ASP.NET MVC with EF Core" description: "In this tutorial, add more entities and relationships and customize the data model by specifying formatting, validation, and mapping rules." author: tdykstra ms.author: tdykstra -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 03/27/2019 ms.topic: tutorial uid: data/ef-mvc/complex-data-model diff --git a/aspnetcore/docfx.json b/aspnetcore/docfx.json index a06befbca72b..1fd423c6a6e4 100644 --- a/aspnetcore/docfx.json +++ b/aspnetcore/docfx.json @@ -51,10 +51,10 @@ }, "fileMetadata": { "author": { - "whats-new/**/**.md": "rick-anderson" + "whats-new/**/**.md": "wadepickett" }, "ms.author": { - "whats-new/**/**.md": "riande" + "whats-new/**/**.md": "wpickett" }, "ms.subservice": { "introduction-to-aspnet-core.md": "index-page", diff --git a/aspnetcore/fundamentals/minimal-apis/resultsStream/7.0-samples/ResultsStreamSample/ResultsStreamSample.csproj b/aspnetcore/fundamentals/minimal-apis/resultsStream/7.0-samples/ResultsStreamSample/ResultsStreamSample.csproj index 1fca67c3d0a8..f778fba5f463 100644 --- a/aspnetcore/fundamentals/minimal-apis/resultsStream/7.0-samples/ResultsStreamSample/ResultsStreamSample.csproj +++ b/aspnetcore/fundamentals/minimal-apis/resultsStream/7.0-samples/ResultsStreamSample/ResultsStreamSample.csproj @@ -16,7 +16,7 @@ - + diff --git a/aspnetcore/fundamentals/url-rewriting.md b/aspnetcore/fundamentals/url-rewriting.md index f86d76b020fc..962e00c8bb80 100644 --- a/aspnetcore/fundamentals/url-rewriting.md +++ b/aspnetcore/fundamentals/url-rewriting.md @@ -4,7 +4,7 @@ author: rick-anderson description: Learn about URL rewriting and redirecting with URL Rewriting Middleware in ASP.NET Core applications. monikerRange: '>= aspnetcore-2.1' ms.author: riande -ms.custom: mvc +ms.custom: mvc, sfi-image-nochange ms.date: 3/3/2022 uid: fundamentals/url-rewriting --- diff --git a/aspnetcore/host-and-deploy/iis/advanced.md b/aspnetcore/host-and-deploy/iis/advanced.md index 51f9185619d5..f060d199a7fb 100644 --- a/aspnetcore/host-and-deploy/iis/advanced.md +++ b/aspnetcore/host-and-deploy/iis/advanced.md @@ -4,7 +4,7 @@ author: tdykstra description: Advanced configuration with the ASP.NET Core Module and Internet Information Services (IIS). monikerRange: '>= aspnetcore-5.0' ms.author: tdykstra -ms.custom: mvc +ms.custom: mvc, sfi-image-nochange ms.date: 03/07/2025 uid: host-and-deploy/iis/advanced --- diff --git a/aspnetcore/host-and-deploy/iis/index.md b/aspnetcore/host-and-deploy/iis/index.md index bdbef0887358..fe3c86e8c2cb 100644 --- a/aspnetcore/host-and-deploy/iis/index.md +++ b/aspnetcore/host-and-deploy/iis/index.md @@ -4,7 +4,7 @@ author: tdykstra description: Learn how to host ASP.NET Core apps on Windows Server Internet Information Services (IIS). monikerRange: '>= aspnetcore-2.1' ms.author: tdykstra -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 04/26/2024 uid: host-and-deploy/iis/index --- diff --git a/aspnetcore/host-and-deploy/iis/web-config.md b/aspnetcore/host-and-deploy/iis/web-config.md index 90ca45524ef2..f51fc546f362 100644 --- a/aspnetcore/host-and-deploy/iis/web-config.md +++ b/aspnetcore/host-and-deploy/iis/web-config.md @@ -4,7 +4,7 @@ author: rick-anderson description: Discover what is inside of the web.config file and how to configure different ASP.NET Core Module options. monikerRange: '>= aspnetcore-5.0' ms.author: riande -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 02/07/2020 uid: host-and-deploy/iis/web-config --- diff --git a/aspnetcore/host-and-deploy/linux-nginx.md b/aspnetcore/host-and-deploy/linux-nginx.md index 6413e012a838..a53206a24a31 100644 --- a/aspnetcore/host-and-deploy/linux-nginx.md +++ b/aspnetcore/host-and-deploy/linux-nginx.md @@ -4,7 +4,7 @@ author: tdykstra description: Learn how to set up Nginx as a reverse proxy on Ubuntu, RHEL and SUSE to forward HTTP traffic to an ASP.NET Core web app running on Kestrel. monikerRange: '>= aspnetcore-3.1' ms.author: tdykstra -ms.custom: mvc, engagement-fy23, linux-related-content +ms.custom: mvc, engagement-fy23, linux-related-content, sfi-ropc-nochange ms.date: 5/8/2023 uid: host-and-deploy/linux-nginx --- diff --git a/aspnetcore/host-and-deploy/linux-nginx/includes/linux-nginx5.md b/aspnetcore/host-and-deploy/linux-nginx/includes/linux-nginx5.md index 19b4c23e9fd5..5b77f5cae1d3 100644 --- a/aspnetcore/host-and-deploy/linux-nginx/includes/linux-nginx5.md +++ b/aspnetcore/host-and-deploy/linux-nginx/includes/linux-nginx5.md @@ -1,5 +1,5 @@ --- -ms.custom: linux-related-content +ms.custom: linux-related-content, sfi-ropc-nochange --- :::moniker range="= aspnetcore-5.0" This guide explains setting up a production-ready ASP.NET Core environment on an Ubuntu 16.04 server. These instructions likely work with newer versions of Ubuntu, but the instructions haven't been tested with newer versions. diff --git a/aspnetcore/migration/31-to-50.md b/aspnetcore/migration/31-to-50.md index 93c9d6124148..45214ff78989 100644 --- a/aspnetcore/migration/31-to-50.md +++ b/aspnetcore/migration/31-to-50.md @@ -3,7 +3,7 @@ title: Migrate from ASP.NET Core 3.1 to .NET 5 author: wadepickett description: Learn how to migrate an ASP.NET Core 3.1 project to ASP.NET Core in .NET 5. ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 12/02/2020 uid: migration/31-to-50 --- diff --git a/aspnetcore/migration/31-to-60.md b/aspnetcore/migration/31-to-60.md index 8d8c6ae19a2b..6a353974957b 100644 --- a/aspnetcore/migration/31-to-60.md +++ b/aspnetcore/migration/31-to-60.md @@ -3,6 +3,7 @@ title: Migrate from ASP.NET Core 3.1 to .NET 6 author: rick-anderson description: Learn how to migrate an ASP.NET Core 3.1 project to ASP.NET Core in .NET 6. ms.author: riande +ms.custom: sfi-ropc-nochange monikerRange: '>= aspnetcore-3.1' ms.date: 10/25/2021 uid: migration/31-to-60 diff --git a/aspnetcore/mvc/models/file-uploads.md b/aspnetcore/mvc/models/file-uploads.md index f228c95b15de..a3430f5850da 100644 --- a/aspnetcore/mvc/models/file-uploads.md +++ b/aspnetcore/mvc/models/file-uploads.md @@ -1594,7 +1594,7 @@ Common storage options for files include: * Services usually offer improved scalability and resiliency over on-premises solutions that are usually subject to single points of failure. * Services are potentially lower cost in large storage infrastructure scenarios. - For more information, see [Quickstart: Use .NET to create a blob in object storage](/azure/storage/blobs/storage-quickstart-blobs-dotnet). The topic demonstrates , but can be used to save a to blob storage when working with a . + For more information, see [Quickstart: Use .NET to create a blob in object storage](/azure/storage/blobs/storage-quickstart-blobs-dotnet). The topic demonstrates [`UploadFromFileAsync`](/dotnet/api/microsoft.azure.storage.file.cloudfile.uploadfromfileasync), but [`UploadFromStreamAsync`](/dotnet/api/microsoft.azure.storage.file.cloudfile.uploadfromstreamasync) can be used to save a to blob storage when working with a . ## File upload scenarios diff --git a/aspnetcore/mvc/views/tag-helpers/intro.md b/aspnetcore/mvc/views/tag-helpers/intro.md index 8aa12febf3a1..d722b9d14c06 100644 --- a/aspnetcore/mvc/views/tag-helpers/intro.md +++ b/aspnetcore/mvc/views/tag-helpers/intro.md @@ -3,7 +3,7 @@ title: Tag Helpers in ASP.NET Core author: tdykstra description: Learn what Tag Helpers are and how to use them in ASP.NET Core. ms.author: tdykstra -ms.custom: H1Hack27Feb2017 +ms.custom: H1Hack27Feb2017, sfi-image-nochange ms.date: 03/18/2019 uid: mvc/views/tag-helpers/intro --- diff --git a/aspnetcore/performance/caching/hybrid.md b/aspnetcore/performance/caching/hybrid.md index 0b38ce34d5f7..23cc0bfda24c 100644 --- a/aspnetcore/performance/caching/hybrid.md +++ b/aspnetcore/performance/caching/hybrid.md @@ -4,6 +4,7 @@ author: tdykstra description: Learn how to use HybridCache library in ASP.NET Core. monikerRange: '>= aspnetcore-9.0' ms.author: tdykstra +ms.custom: sfi-ropc-nochange ms.date: 05/22/2025 uid: performance/caching/hybrid ms.ai: assisted diff --git a/aspnetcore/security/app-secrets.md b/aspnetcore/security/app-secrets.md index 87361e78a89d..48da93483124 100644 --- a/aspnetcore/security/app-secrets.md +++ b/aspnetcore/security/app-secrets.md @@ -3,8 +3,8 @@ title: Safe storage of app secrets in development in ASP.NET Core author: tdykstra description: Learn how to store and retrieve sensitive information during the development of an ASP.NET Core app. ms.author: tdykstra +ms.custom: mvc, sfi-ropc-nochange monikerRange: '>= aspnetcore-3.0' -ms.custom: mvc ms.date: 10/30/2024 uid: security/app-secrets --- diff --git a/aspnetcore/security/authentication/2fa.md b/aspnetcore/security/authentication/2fa.md index 3ce84791777e..351bd0183f57 100644 --- a/aspnetcore/security/authentication/2fa.md +++ b/aspnetcore/security/authentication/2fa.md @@ -4,8 +4,8 @@ author: rick-anderson description: Learn how to set up two-factor authentication (2FA) with an ASP.NET Core app. monikerRange: '< aspnetcore-2.0' ms.author: riande +ms.custom: mvc, sfi-image-nochange ms.date: 09/22/2018 -ms.custom: mvc uid: security/authentication/2fa --- # Two-factor authentication with SMS in ASP.NET Core diff --git a/aspnetcore/security/authentication/accconfirm.md b/aspnetcore/security/authentication/accconfirm.md index f0ec232e5687..7fc064ffe42e 100644 --- a/aspnetcore/security/authentication/accconfirm.md +++ b/aspnetcore/security/authentication/accconfirm.md @@ -3,6 +3,7 @@ title: Account confirmation and password recovery in ASP.NET Core author: rick-anderson description: Learn how to build an ASP.NET Core app with email confirmation and password reset. ms.author: riande +ms.custom: sfi-image-nochange monikerRange: '>= aspnetcore-3.1' ms.date: 2/9/2022 uid: security/authentication/accconfirm diff --git a/aspnetcore/security/authentication/social/facebook-logins.md b/aspnetcore/security/authentication/social/facebook-logins.md index e4a6193df23c..1fcca0fdc9ed 100644 --- a/aspnetcore/security/authentication/social/facebook-logins.md +++ b/aspnetcore/security/authentication/social/facebook-logins.md @@ -3,7 +3,7 @@ title: Facebook external login setup in ASP.NET Core author: rick-anderson description: Tutorial with code examples demonstrating the integration of Facebook account user authentication into an existing ASP.NET Core app. ms.author: riande -ms.custom: mvc +ms.custom: mvc, sfi-image-nochange ms.date: 12/08/2021 monikerRange: '>= aspnetcore-3.0' uid: security/authentication/facebook-logins diff --git a/aspnetcore/security/authentication/social/index.md b/aspnetcore/security/authentication/social/index.md index 8ab67b9fe851..b4be6d3c0b55 100644 --- a/aspnetcore/security/authentication/social/index.md +++ b/aspnetcore/security/authentication/social/index.md @@ -3,7 +3,7 @@ title: Using external login providers with Identity in ASP.NET Core author: rick-anderson description: Create an ASP.NET Core app using Identity with external authentication providers such as Facebook, Twitter, Google, and Microsoft. ms.author: riande -ms.custom: mvc +ms.custom: mvc, sfi-image-nochange ms.date: 07/09/2025 uid: security/authentication/social/index --- diff --git a/aspnetcore/security/authentication/ws-federation.md b/aspnetcore/security/authentication/ws-federation.md index 8df18c74fd6b..fc7373a6be90 100644 --- a/aspnetcore/security/authentication/ws-federation.md +++ b/aspnetcore/security/authentication/ws-federation.md @@ -4,7 +4,7 @@ author: chlowell description: This tutorial demonstrates how to use WS-Federation in an ASP.NET Core app. monikerRange: '>= aspnetcore-2.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-image-nochange ms.date: 01/16/2019 uid: security/authentication/ws-federation --- diff --git a/aspnetcore/security/authorization/secure-data.md b/aspnetcore/security/authorization/secure-data.md index 686cb4c073b3..fbea052a9315 100644 --- a/aspnetcore/security/authorization/secure-data.md +++ b/aspnetcore/security/authorization/secure-data.md @@ -3,8 +3,8 @@ title: Create an ASP.NET Core app with user data protected by authorization author: rick-anderson description: Learn how to create an ASP.NET Core web app with user data protected by authorization. Includes HTTPS, authentication, security, ASP.NET Core Identity. ms.author: riande +ms.custom: mvc, sfi-image-nochange ms.date: 12/5/2021 -ms.custom: mvc ms.sfi.ropc: t uid: security/authorization/secure-data --- diff --git a/aspnetcore/security/docker-compose-https.md b/aspnetcore/security/docker-compose-https.md index 602e0e16710a..e98335f62908 100644 --- a/aspnetcore/security/docker-compose-https.md +++ b/aspnetcore/security/docker-compose-https.md @@ -3,7 +3,7 @@ title: Hosting ASP.NET Core image in container using docker compose with HTTPS author: ravipal description: Learn how to host ASP.NET Core Images with Docker Compose over HTTPS ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 09/07/2024 uid: security/docker-compose-https --- diff --git a/aspnetcore/security/docker-https.md b/aspnetcore/security/docker-https.md index 3e687e5cffc2..443ccd5e44c1 100644 --- a/aspnetcore/security/docker-https.md +++ b/aspnetcore/security/docker-https.md @@ -3,7 +3,7 @@ title: Hosting ASP.NET Core Images with Docker over HTTPS author: wadepickett description: Learn how to host ASP.NET Core Images with Docker over HTTPS ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 09/07/2024 uid: security/docker-https --- diff --git a/aspnetcore/security/index.md b/aspnetcore/security/index.md index b8b91b50181f..d84f211a233c 100644 --- a/aspnetcore/security/index.md +++ b/aspnetcore/security/index.md @@ -3,7 +3,7 @@ title: ASP.NET Core security topics author: tdykstra description: Provides links to articles on authentication, authorization, and security in ASP.NET Core. ms.author: tdykstra -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 3/9/2022 uid: security/index --- diff --git a/aspnetcore/tutorials/first-mongo-app.md b/aspnetcore/tutorials/first-mongo-app.md index ccd22ebabd8a..4c4ebfcd9b3f 100644 --- a/aspnetcore/tutorials/first-mongo-app.md +++ b/aspnetcore/tutorials/first-mongo-app.md @@ -5,7 +5,7 @@ author: wadepickett description: This tutorial demonstrates how to create an ASP.NET Core web API using a MongoDB NoSQL database. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett -ms.custom: mvc +ms.custom: mvc, sfi-ropc-nochange ms.date: 04/09/2025 uid: tutorials/first-mongo-app --- diff --git a/aspnetcore/tutorials/first-mvc-app/adding-model.md b/aspnetcore/tutorials/first-mvc-app/adding-model.md index 1eda835da31c..8ba76d45d4dd 100644 --- a/aspnetcore/tutorials/first-mvc-app/adding-model.md +++ b/aspnetcore/tutorials/first-mvc-app/adding-model.md @@ -4,6 +4,7 @@ author: wadepickett description: Part 4 of tutorial series on ASP.NET Core MVC. monikerRange: '>= aspnetcore-3.1' ms.author: wpickett +ms.custom: sfi-ropc-nochange ms.date: 03/28/2025 uid: tutorials/first-mvc-app/adding-model --- diff --git a/aspnetcore/tutorials/first-mvc-app/working-with-sql.md b/aspnetcore/tutorials/first-mvc-app/working-with-sql.md index 20dc2a32af89..5258dabc25c3 100644 --- a/aspnetcore/tutorials/first-mvc-app/working-with-sql.md +++ b/aspnetcore/tutorials/first-mvc-app/working-with-sql.md @@ -4,6 +4,7 @@ author: wadepickett description: Part 5 of tutorial series on ASP.NET Core MVC. ms.author: wpickett ms.date: 03/02/2025 +ms.custom: sfi-ropc-nochange monikerRange: '>= aspnetcore-3.1' uid: tutorials/first-mvc-app/working-with-sql --- diff --git a/aspnetcore/tutorials/publish-to-azure-webapp-using-vs.md b/aspnetcore/tutorials/publish-to-azure-webapp-using-vs.md index 647c70d9f2b6..47a4ad94729d 100644 --- a/aspnetcore/tutorials/publish-to-azure-webapp-using-vs.md +++ b/aspnetcore/tutorials/publish-to-azure-webapp-using-vs.md @@ -4,7 +4,7 @@ author: wadepickett description: Learn how to publish an ASP.NET Core app to Azure App Service using Visual Studio. monikerRange: '>= aspnetcore-7.0' ms.author: wpickett -ms.custom: "devx-track-csharp, mvc, engagement-fy23" +ms.custom: devx-track-csharp, mvc, engagement-fy23, sfi-image-nochange ms.date: 02/03/2023 uid: tutorials/publish-to-azure-webapp-using-vs ---