[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-migrating-webforms-to-blazor-server":3,"mdc-8l5iyq-key":36,"related-repo-microsoft-migrating-webforms-to-blazor-server":3750,"related-org-microsoft-migrating-webforms-to-blazor-server":3848},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":34,"mdContent":35},"migrating-webforms-to-blazor-server","migrate ASP.NET Web Forms to Blazor Server","Migrates ASP.NET Web Forms applications to Blazor Server using Blazor patterns. Handles complete migration: Blazor project setup (side-by-side or in-place), Routes component configuration, App.razor InteractiveServer render modes, static asset migration (Content\u002FScripts\u002FImages to wwwroot), markup conversion (.aspx\u002F.ascx\u002F.master to .razor), control translation (asp: prefix removal to native HTML\u002FBlazor components), Web Forms expression block conversion to Razor syntax, lifecycle mapping (Page_Load to OnInitializedAsync), and Master pages to Layouts. Use when migrating Web Forms to Blazor Server, converting .aspx pages with CSS\u002FJavaScript compatibility, or fixing build errors for System.Web.UI types (Page, Control), ViewState, Response.Redirect, Server.MapPath, asp: controls, or Web Forms namespaces.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19,22,23],{"name":13,"slug":14,"type":15},"Modernization","modernization","tag",{"name":17,"slug":18,"type":15},"ASP.NET Core","asp-net-core",{"name":20,"slug":21,"type":15},"Blazor","blazor",{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},"Migration","migration",7,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins","2026-07-18T05:14:10.995756",null,1,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":29},[],"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fupgrade-agent\u002Fextenders\u002Fupgrade-dotnet\u002Fupgrade\u002Fskills\u002Flazy\u002Fweb\u002Fwebforms\u002Fmigrating-webforms-to-blazor-server","---\r\nname: migrating-webforms-to-blazor-server\r\ndescription: >\r\n  Migrates ASP.NET Web Forms applications to Blazor Server using Blazor patterns. Handles\r\n  complete migration: Blazor project setup (side-by-side or in-place), Routes component\r\n  configuration, App.razor InteractiveServer render modes, static asset migration\r\n  (Content\u002FScripts\u002FImages to wwwroot), markup conversion (.aspx\u002F.ascx\u002F.master to .razor), control\r\n  translation (asp: prefix removal to native HTML\u002FBlazor components), Web Forms expression block\r\n  conversion to Razor syntax, lifecycle mapping (Page_Load to OnInitializedAsync), and Master\r\n  pages to Layouts. Use when migrating Web Forms to Blazor Server, converting .aspx pages with\r\n  CSS\u002FJavaScript compatibility, or fixing build errors for System.Web.UI types (Page, Control),\r\n  ViewState, Response.Redirect, Server.MapPath, asp: controls, or Web Forms namespaces.\r\nmetadata:\r\n  discovery: lazy\r\n  traits: .NET|CSharp|VisualBasic|DotNetCore\r\n---\r\n\r\n# Web Forms to Blazor Server Migration\r\n\r\nMigrate ASP.NET Web Forms applications to Blazor Server using Blazor patterns. This skill provides complete migration guidance including project setup, configuration, and page conversion.\r\n## Overview\r\n\r\nThis skill covers end-to-end migration of Web Forms pages to Blazor components — replacing `asp:` server controls with HTML elements and Blazor directives, migrating code-behind lifecycles to component lifecycles, and converting master pages to layouts.\r\n\r\n## Related Skills\r\n\r\n**Reference guide for conditional\u002Falternative approaches.** These skills address specific migration scenarios you may encounter based on your project's data access patterns, authentication system, and technology stack. The workflow steps below contain explicit instructions on when to invoke each skill.\r\n\r\n| Skill | Use For |\r\n|-------|---------|\r\n| **managing-blazor-server-authentication** | Authentication setup, cookie auth in circuits, HttpContext NULL errors |\r\n| **managing-blazor-server-data-access** | Data access, Session state in circuits, DbContext factory pattern, shopping cart persistence (referenced in Step 5 for data layer migration) |\r\n| **migrating-mvc-static-files** | Static file migration from Content\u002FScripts to wwwroot (executed in Step 2) |\r\n\r\n---\r\n\r\n## Workflow\r\n\r\nComplete migration tasks in order. Reference the child documents for detailed transformation patterns and control mappings.\r\n\r\n```\r\nMigration Progress:\r\n- [ ] Step 1: Prepare Blazor project\r\n- [ ] Step 2: Migrate static assets to wwwroot\r\n- [ ] Step 3: Configure _Imports.razor\r\n- [ ] Step 4: Configure App.razor render mode\r\n- [ ] Step 5: Copy\u002Frename files\r\n- [ ] Step 6: Transform markup to Blazor\r\n- [ ] Step 7: Transform code-behind\r\n- [ ] Step 8: Build and validate\r\n```\r\n\r\n---\r\n\r\n## Step 1: Prepare Blazor Project\r\n\r\nInspect the workspace and user intent to determine the migration approach automatically:\r\n\r\n**Check for explicit user instruction:**\r\n- If user explicitly requested creating a new Blazor project → use **side-by-side migration**\r\n- If user explicitly requested converting the project in place → use **in-place migration**\r\n- If user requested moving\u002Fmigrating specific pages without mentioning a new project → check workspace context (next)\r\n\r\n**If user intent is unclear, check workspace:**\r\n1. Search the solution for existing Blazor projects (projects with `\u003CProject Sdk=\"Microsoft.NET.Sdk.Web\">` and Blazor framework references)\r\n2. If no Blazor project exists in the solution → use **side-by-side migration** (create new project)\r\n3. If a Blazor project already exists → use **in-place migration** (migrate into existing project)\r\n\r\n**Apply the determined approach:**\r\n\r\n**For side-by-side migration:**\r\n```bash\r\ndotnet new blazor -n MyBlazorApp --interactivity Server\r\n```\r\n\r\n**For in-place migration:**\r\n1. Identify the target project (existing Blazor project, or the WebForms project being converted)\r\n2. If converting a WebForms project, ensure it is SDK-style and targets .NET 6+ first (use the SDK-style conversion skill if needed)\r\n3. Add the Blazor framework reference to the project file:\r\n   ```xml\r\n   \u003CItemGroup>\r\n     \u003CFrameworkReference Include=\"Microsoft.AspNetCore.App\" \u002F>\r\n   \u003C\u002FItemGroup>\r\n   ```\r\n4. Create or update `Program.cs` with standard Blazor Server hosting setup if not already present\r\n5. Add `App.razor`, `_Imports.razor`, and a layout file if they don't exist\r\n\r\n### Database Provider Detection (If Using Entity Framework)\r\n\r\nIf the Web Forms project has a `Models\u002F` directory or uses Entity Framework, check the `Web.config` connection strings to determine the database provider:\r\n\r\n| Web.config Indicator | Database Provider | EF Core Package to Install |\r\n|---------------------|-------------------|---------------------------|\r\n| `providerName=\"System.Data.SqlClient\"` | SQL Server | `Microsoft.EntityFrameworkCore.SqlServer` |\r\n| `providerName=\"System.Data.SQLite\"` | SQLite | `Microsoft.EntityFrameworkCore.Sqlite` |\r\n| `providerName=\"Npgsql\"` | PostgreSQL | `Npgsql.EntityFrameworkCore.PostgreSQL` |\r\n| `providerName=\"MySql.Data.MySqlClient\"` | MySQL | `Pomelo.EntityFrameworkCore.MySql` |\r\n\r\n**Add the detected provider to your Blazor project:**\r\n```bash\r\n# Example for SQL Server\r\ndotnet add package Microsoft.EntityFrameworkCore.SqlServer\r\ndotnet add package Microsoft.EntityFrameworkCore.Tools\r\n```\r\n\r\n**Important:** Use the **same database provider** as the original Web Forms project. Do not change providers (e.g., SQL Server → SQLite) unless explicitly required, as this can cause data type compatibility issues.\r\n\r\n---\r\n\r\n## Step 2: Migrate Static Assets to wwwroot\r\n\r\n**Execute the `migrating-mvc-static-files` skill** to migrate Content\u002FScripts\u002FImages to wwwroot. Complete all steps in that skill, then return here for Blazor-specific additions. That skill handles:\r\n- Content\u002FScripts\u002FImages folders to wwwroot\u002Fcss\u002Fjs\u002Fimages migration\r\n- wwwroot directory structure creation\r\n- UseStaticFiles middleware configuration\r\n- Path reference updates in views and code\r\n- VirtualPathProvider to IFileProvider replacement\r\n- Files outside wwwroot configuration\r\n\r\n**After completing the static file migration skill, apply these Blazor-specific additions:**\r\n\r\n1. **Add CSS\u002FJS references to `App.razor` preserving bundle order**:\r\n\r\n   CSS order matters for cascade rules. Check `App_Start\u002FBundleConfig.cs` for the StyleBundle's `.Include()` calls and add `\u003Clink>` tags in `App.razor` **in the same order**. Verify all referenced CSS files exist in `wwwroot\u002Fcss\u002F`.\r\n\r\n   ```razor\r\n   \u003C!DOCTYPE html>\r\n   \u003Chtml>\r\n   \u003Chead>\r\n       \u003C!-- Original site stylesheets - preserve BundleConfig.cs order -->\r\n       \u003Clink rel=\"stylesheet\" href=\"css\u002Fbootstrap.min.css\" \u002F>\r\n       \u003Clink rel=\"stylesheet\" href=\"css\u002FSite.css\" \u002F>\r\n   \u003C\u002Fhead>\r\n   \u003Cbody>\r\n       \u003C!-- Original site scripts -->\r\n       \u003Cscript src=\"js\u002Fjquery-3.7.1.min.js\">\u003C\u002Fscript>\r\n       \u003Cscript src=\"js\u002Fbootstrap.bundle.min.js\">\u003C\u002Fscript>\r\n       \u003Cscript src=\"js\u002FSite.js\">\u003C\u002Fscript>\r\n   \u003C\u002Fbody>\r\n   \u003C\u002Fhtml>\r\n   ```\r\n\r\n> ⚠️ **WARNING:** The `bootstrap` NuGet package does not expose files through `_content\u002Fbootstrap\u002F` in Blazor Server. Copy Bootstrap files from the original `Content\u002F` folder to `wwwroot\u002Fcss\u002F` to preserve the exact version and avoid class name changes required by version upgrades.\r\n\r\n**Search for additional static asset folders** beyond Content\u002FScripts\u002FImages (e.g., `Pics`, `Files`, `Uploads`, `Documents`). Check for image\u002Fdocument file types and hardcoded paths in service classes, then migrate any found folders to `wwwroot\u002F` preserving their names.\r\n\r\n---\r\n\r\n## Step 3: Configure `_Imports.razor`\r\n\r\n```razor\r\n@using Microsoft.AspNetCore.Components\r\n@using Microsoft.AspNetCore.Components.Web\r\n@using static Microsoft.AspNetCore.Components.Web.RenderMode\r\n```\r\n\r\n> **Note:** The `@using static` import lets you write `InteractiveServer` as shorthand in `App.razor`. Do **not** add `@rendermode InteractiveServer` as a line in `_Imports.razor` — `@rendermode` is a directive attribute that belongs on component instances, not a standalone directive.\r\n\r\n---\r\n\r\n## Step 4: Configure Render Mode in `App.razor`\r\n\r\nThe `dotnet new blazor --interactivity Server` template generates `App.razor` with render mode already set. Verify it contains:\r\n\r\n```razor\r\n\u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\r\n...\r\n\u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\r\n```\r\n\r\nThis enables global server interactivity for all pages. See [ASP.NET Core Blazor render modes](https:\u002F\u002Flearn.microsoft.com\u002Faspnet\u002Fcore\u002Fblazor\u002Fcomponents\u002Frender-modes) for per-page alternatives.\r\n\r\n---\r\n\r\n## Step 5: Copy\u002FMove and Rename Files\r\n\r\nBased on the migration approach determined in Step 1:\r\n\r\n**For side-by-side migration:** Copy files from the WebForms project to the Blazor project and rename them. Place them in the Blazor project respecting Blazor conventions (pages in `\u002FComponents\u002FPages\u002F`, layouts in `\u002FComponents\u002FLayout\u002F`, shared components in `\u002FComponents\u002F`).\r\n\r\n**For in-place migration:** Rename files in place within the same project. They can stay in their current locations initially.\r\n\r\n| Original | New Name | Notes |\r\n|----------|----------|-------|\r\n| `MyPage.aspx` | `MyPage.razor` | Page markup |\r\n| `MyPage.aspx.cs` | `MyPage.razor.cs` | Code-behind (keep as partial class) |\r\n| `MyControl.ascx` | `MyControl.razor` | User control markup |\r\n| `MyControl.ascx.cs` | `MyControl.razor.cs` | User control code-behind |\r\n| `Site.Master` | `MainLayout.razor` | Master page → Layout |\r\n| `Site.Master.cs` | `MainLayout.razor.cs` | Layout code-behind |\r\n\r\n### Additional Files to Copy\r\n\r\n**Models and Business Logic directories:**\r\nIf the WebForms project has `Models\u002F`, `BLL\u002F`, `BusinessLogic\u002F`, or `Services\u002F` folders, copy all `.cs` files to the Blazor project preserving directory structure.\r\n\r\n> **Data layer migration:** EF6 namespace updates, DbContext configuration, connection strings, and session state migration are handled by **`managing-blazor-server-data-access`**. Execute that skill when:\r\n> - Build errors reference `System.Data.Entity` namespaces\r\n> - User asks about data access, Entity Framework, or database setup  \r\n> - Session state or shopping cart functionality needs migration\r\n> - After markup migration is complete (if deferring data concerns)\r\n---\r\n\r\n## Step 6: Transform Markup to Blazor Components\r\n\r\nApply these mechanical transformations to each `.razor` file:\r\n\r\n**Control conversions (native HTML\u002FBlazor):**\r\n- `\u003Casp:Label>` → `\u003Clabel>` or `@value` inline\r\n- `\u003Casp:TextBox>` → `\u003Cinput @bind=\"value\" \u002F>`\r\n- `\u003Casp:Button>` → `\u003Cbutton @onclick=\"Handler\">Text\u003C\u002Fbutton>`\r\n- `\u003Casp:DropDownList>` → `\u003Cselect @bind=\"value\">@foreach...\u003C\u002Fselect>`\r\n- `\u003Casp:GridView>` → `\u003Ctable>` with `@foreach` rows (or `QuickGrid` for advanced scenarios)\r\n- `\u003Casp:ListView>` \u002F `\u003Casp:Repeater>` → `@foreach` loop with custom markup\r\n- `\u003Casp:RequiredFieldValidator>` etc. → `\u003CEditForm>` with `\u003CDataAnnotationsValidator>` and `\u003CValidationMessage For=\"...\">`\r\n- `\u003Casp:Login>` → `\u003Cform method=\"post\">` → minimal API endpoint (see managing-blazor-server-authentication)\r\n- `\u003Casp:LoginView>` → `\u003CAuthorizeView>` with `\u003CNotAuthorized>` \u002F `\u003CAuthorized>` templates\r\n- `\u003Casp:LoginName>` → `@context.User.Identity?.Name` inside `\u003CAuthorizeView>`\r\n- See **[ref\u002Fcontrol-reference.md](ref\u002Fcontrol-reference.md)** for complete mapping table\r\n\r\n**Directive conversions:**\r\n- `\u003C%@ Page Title=\"X\" ... %>` → `@page \"\u002Froute\"` (derive route from file path)\r\n- `\u003C%@ Master ... %>` → `@inherits LayoutComponentBase`\r\n- `\u003C%@ Control ... %>` → (remove entirely for user controls)\r\n- `\u003C%@ Import Namespace=\"X\" %>` → `@using X`\r\n- Remove directive attributes: `AutoEventWireup`, `CodeBehind`, `Inherits`, `EnableViewState`, `MasterPageFile`\r\n\r\n**Expression conversions:**\r\n- `\u003C%: expr %>` → `@(expr)`\r\n- `\u003C%= expr %>` → `@(expr)`\r\n- `\u003C%# Item.Property %>` → `@context.Property` (in templates)\r\n- `\u003C%# Eval(\"Property\") %>` → `@context.Property`\r\n- `\u003C%# Bind(\"Property\") %>` → `@bind-Value=\"context.Property\"`\r\n- `\u003C%-- comment --%>` → `@* comment *@`\r\n- `\u003C% if (x) { %>` → `@if (x) {`\r\n- `\u003C% } %>` → `}`\r\n\r\n**URL conversions:**\r\n- `href=\"~\u002Fpath\"` → `href=\"\u002Fpath\"`\r\n- `NavigateUrl=\"~\u002Fpath\"` → `NavigateUrl=\"\u002Fpath\"`\r\n- `ImageUrl=\"~\u002Fimages\u002Fx.png\"` → `ImageUrl=\"\u002Fimages\u002Fx.png\"`\r\n\r\n**Content\u002FLayout conversions:**\r\n- Remove `\u003Casp:Content ContentPlaceHolderID=\"MainContent\">...\u003C\u002Fasp:Content>` wrappers (keep inner content)\r\n- `\u003Casp:Content ContentPlaceHolderID=\"HeadContent\">` → `\u003CHeadContent>`\r\n- `\u003Casp:ContentPlaceHolder ID=\"MainContent\" \u002F>` → `@Body` (in layouts)\r\n- `\u003Cform runat=\"server\">` → `\u003Cdiv>` (preserves CSS block formatting context)\r\n\r\nRead **[ref\u002Fmarkup-transforms.md](ref\u002Fmarkup-transforms.md)** for complete transformation tables and examples.\r\n\r\n---\r\n\r\n## Step 7: Transform Code-Behind (Structural)\r\n\r\nFor each `.razor.cs` file, apply these structural transformations. Read **[ref\u002Fcode-transforms.md](ref\u002Fcode-transforms.md)** for detailed patterns:\r\n\r\n**Lifecycle conversions:**\r\n- `Page_Load` → `OnInitializedAsync` (for first-load initialization)\r\n- `Page_PreRender` → `OnParametersSetAsync` (for pre-render logic)\r\n- Remove `if (!IsPostBack)` guards — `OnInitializedAsync` runs once on first render (no postback concept)\r\n\r\n> ⚠️ **Parameter-driven data loading:** If the page loads data based on route parameters \r\n> or query strings (e.g., category ID, product ID), use `OnParametersSetAsync` instead of \r\n> `OnInitializedAsync`. Unlike Web Forms postbacks, Blazor reuses component instances when \r\n> only the route parameter changes — `OnInitializedAsync` won't re-run, but \r\n> `OnParametersSetAsync` will.\r\n\r\n**Event handler signatures:**\r\n- Remove `object sender, EventArgs e` parameters\r\n- Change `protected void` → `private void` (or `async Task`)\r\n\r\n**Navigation:**\r\n- `Response.Redirect(\"~\u002Fpath\")` → `NavigationManager.NavigateTo(\"\u002Fpath\")`\r\n- Add `@inject NavigationManager NavigationManager` to `.razor` file\r\n\r\n**Page title:**\r\n- `Page.Title = \"...\"` in code-behind → `\u003CPageTitle>...\u003C\u002FPageTitle>` in markup\r\n\r\n**Data loading:**\r\n- Load data in `OnInitializedAsync` using injected services\r\n- Bind data to component properties and render with `@foreach`\r\n- Inject required services (`@inject ProductService ProductService`)\r\n\r\n**State management:**\r\n- `ViewState[\"key\"]` → component field (`private string _value;`)\r\n- `Session[\"key\"]` → scoped DI service pattern\r\n\r\nRead **[ref\u002Fcode-transforms.md](ref\u002Fcode-transforms.md)** for detailed patterns.\r\n\r\n## Step 8: Build and Validate Migration Quality\r\n\r\nBuild the project and verify migration completeness:\r\n\r\n```bash\r\ndotnet build\r\n```\r\n\r\n**After successful build, review migration completeness:**\r\n\r\n1. **Check that controls were converted to Blazor:**\r\n\r\n   Search `.razor` files to verify Web Forms server controls were replaced:\r\n\r\n   - ✅ Files contain native HTML\u002Fcomponents like `\u003Cinput`, `\u003Cdiv`, `\u003Cbutton`, `\u003Cselect`, `@foreach` loops\r\n   - ⚠️ Any remaining `\u003Casp:` prefixes or `runat=\"server\"` attributes indicate incomplete migration\r\n\r\n2. **Verify namespace imports in `_Imports.razor`:**\r\n\r\n   ```razor\r\n   @using Microsoft.AspNetCore.Components\r\n   @using Microsoft.AspNetCore.Components.Web\r\n   @using static Microsoft.AspNetCore.Components.Web.RenderMode\r\n   ```\r\n\r\n3. **Validate CSS\u002FJavaScript compatibility:**\r\n\r\n   If existing CSS or JavaScript depends on Web Forms HTML structure:\r\n   - Run the application and test that styles and scripts still work correctly\r\n   - Blazor renders standard HTML — you may need to adjust CSS selectors or JavaScript event handlers to match the new HTML structure\r\n\r\nIf migration issues remain after build validation, revisit the transformation references above and re-check lifecycle, data-binding, and control mapping patterns.\r\n\r\n---\r\n\r\n## Quick Reference\r\n\r\n### Common Transformations\r\n\r\n**Controls:** Remove `asp:` prefix, `runat=\"server\"`, and replace with native HTML\r\n```html\r\n\u003C!-- Before --> \u003Casp:Label ID=\"lblName\" runat=\"server\" Text=\"Hello\" \u002F>\r\n\u003C!-- After  --> \u003Clabel>Hello\u003C\u002Flabel>\r\n\r\n\u003C!-- Before --> \u003Casp:TextBox ID=\"Name\" runat=\"server\" \u002F>\r\n\u003C!-- After  --> \u003Cinput @bind=\"model.Name\" \u002F>\r\n\r\n\u003C!-- Before --> \u003Casp:Button Text=\"Submit\" OnClick=\"Submit_Click\" runat=\"server\" \u002F>\r\n\u003C!-- After  --> \u003Cbutton @onclick=\"Submit_Click\">Submit\u003C\u002Fbutton>\r\n```\r\n\r\n**Lifecycle:** Convert Page_Load to OnInitializedAsync\r\n```csharp\r\n\u002F\u002F Before\r\nprotected void Page_Load(object sender, EventArgs e) { }\r\n\r\n\u002F\u002F After\r\nprotected override async Task OnInitializedAsync() { }\r\n```\r\n\r\n---\r\n\r\n## Reference Documents\r\n\r\nFor detailed transformation patterns, control mappings, and troubleshooting:\r\n\r\n- **[ref\u002Fmarkup-transforms.md](ref\u002Fmarkup-transforms.md)** — Directive conversion, expression syntax, URL transformations, form wrapper handling\r\n- **[ref\u002Fcode-transforms.md](ref\u002Fcode-transforms.md)** — Lifecycle methods, event handlers, navigation, data binding SelectMethod patterns, query strings, Master Page to Layout migration\r\n- **[ref\u002Fcontrol-reference.md](ref\u002Fcontrol-reference.md)** — Complete control translation tables mapping Web Forms controls to native HTML\u002FBlazor equivalents, Ajax Control Toolkit migration, structural components, theming infrastructure\r\n\r\n\r\n---\r\n\r\n## Success Criteria\r\n\r\n**Migration scope:**\r\n- [ ] Migration approach determined (side-by-side or in-place)\r\n- [ ] Target Blazor project created and configured\r\n- [ ] All targeted Web Forms files identified\r\n\r\n**File transformations:**\r\n- [ ] All migrated files renamed with `.razor` extension\r\n- [ ] All `asp:` prefixes removed from controls\r\n- [ ] All `runat=\"server\"` attributes removed\r\n- [ ] Web Forms expressions converted to Razor syntax\r\n- [ ] `~\u002F` URLs replaced with `\u002F`\r\n\r\n**Data binding:**\r\n- [ ] DataSource controls (`SqlDataSource`, `ObjectDataSource`, `EntityDataSource`) replaced with injected services\r\n- [ ] Data loaded in component lifecycle methods (`OnInitializedAsync` \u002F `OnParametersSetAsync`) as appropriate\r\n- [ ] Lists\u002Ftables rendered using Blazor markup (`@foreach`, components such as `QuickGrid` when needed)\r\n\r\n**Code-behind:**\r\n- [ ] `Page_Load` → `OnInitializedAsync`\r\n- [ ] `Response.Redirect` → `NavigationManager.NavigateTo`\r\n- [ ] Master pages converted to Blazor layouts\r\n\r\n**Validation:**\r\n- [ ] Target project builds without errors\r\n- [ ] Application runs and renders migrated pages correctly\r\n- [ ] Interactive features (buttons, forms, navigation) function as expected\r\n- [ ] For side-by-side: original WebForms project still builds and runs (if preservation is required)\r\n\r\n",{"data":37,"body":41},{"name":4,"description":6,"metadata":38},{"discovery":39,"traits":40},"lazy",".NET|CSharp|VisualBasic|DotNetCore",{"type":42,"children":43},"root",[44,53,59,66,80,86,97,173,177,183,188,200,203,209,214,222,252,260,299,307,315,366,374,461,468,489,620,628,686,703,706,712,729,762,770,973,1020,1067,1070,1081,1112,1177,1180,1191,1211,1242,1258,1261,1267,1272,1305,1314,1497,1503,1550,1604,1607,1613,1626,1634,1891,1899,2002,2010,2141,2149,2200,2208,2276,2291,2294,2300,2323,2331,2389,2431,2439,2482,2490,2528,2536,2558,2566,2603,2611,2643,2656,2662,2667,2686,2694,2848,2853,2856,2862,2868,2892,3295,3305,3353,3356,3362,3367,3406,3409,3415,3423,3457,3465,3547,3555,3635,3643,3696,3704,3744],{"type":45,"tag":46,"props":47,"children":49},"element","h1",{"id":48},"web-forms-to-blazor-server-migration",[50],{"type":51,"value":52},"text","Web Forms to Blazor Server Migration",{"type":45,"tag":54,"props":55,"children":56},"p",{},[57],{"type":51,"value":58},"Migrate ASP.NET Web Forms applications to Blazor Server using Blazor patterns. This skill provides complete migration guidance including project setup, configuration, and page conversion.",{"type":45,"tag":60,"props":61,"children":63},"h2",{"id":62},"overview",[64],{"type":51,"value":65},"Overview",{"type":45,"tag":54,"props":67,"children":68},{},[69,71,78],{"type":51,"value":70},"This skill covers end-to-end migration of Web Forms pages to Blazor components — replacing ",{"type":45,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":51,"value":77},"asp:",{"type":51,"value":79}," server controls with HTML elements and Blazor directives, migrating code-behind lifecycles to component lifecycles, and converting master pages to layouts.",{"type":45,"tag":60,"props":81,"children":83},{"id":82},"related-skills",[84],{"type":51,"value":85},"Related Skills",{"type":45,"tag":54,"props":87,"children":88},{},[89,95],{"type":45,"tag":90,"props":91,"children":92},"strong",{},[93],{"type":51,"value":94},"Reference guide for conditional\u002Falternative approaches.",{"type":51,"value":96}," These skills address specific migration scenarios you may encounter based on your project's data access patterns, authentication system, and technology stack. The workflow steps below contain explicit instructions on when to invoke each skill.",{"type":45,"tag":98,"props":99,"children":100},"table",{},[101,120],{"type":45,"tag":102,"props":103,"children":104},"thead",{},[105],{"type":45,"tag":106,"props":107,"children":108},"tr",{},[109,115],{"type":45,"tag":110,"props":111,"children":112},"th",{},[113],{"type":51,"value":114},"Skill",{"type":45,"tag":110,"props":116,"children":117},{},[118],{"type":51,"value":119},"Use For",{"type":45,"tag":121,"props":122,"children":123},"tbody",{},[124,141,157],{"type":45,"tag":106,"props":125,"children":126},{},[127,136],{"type":45,"tag":128,"props":129,"children":130},"td",{},[131],{"type":45,"tag":90,"props":132,"children":133},{},[134],{"type":51,"value":135},"managing-blazor-server-authentication",{"type":45,"tag":128,"props":137,"children":138},{},[139],{"type":51,"value":140},"Authentication setup, cookie auth in circuits, HttpContext NULL errors",{"type":45,"tag":106,"props":142,"children":143},{},[144,152],{"type":45,"tag":128,"props":145,"children":146},{},[147],{"type":45,"tag":90,"props":148,"children":149},{},[150],{"type":51,"value":151},"managing-blazor-server-data-access",{"type":45,"tag":128,"props":153,"children":154},{},[155],{"type":51,"value":156},"Data access, Session state in circuits, DbContext factory pattern, shopping cart persistence (referenced in Step 5 for data layer migration)",{"type":45,"tag":106,"props":158,"children":159},{},[160,168],{"type":45,"tag":128,"props":161,"children":162},{},[163],{"type":45,"tag":90,"props":164,"children":165},{},[166],{"type":51,"value":167},"migrating-mvc-static-files",{"type":45,"tag":128,"props":169,"children":170},{},[171],{"type":51,"value":172},"Static file migration from Content\u002FScripts to wwwroot (executed in Step 2)",{"type":45,"tag":174,"props":175,"children":176},"hr",{},[],{"type":45,"tag":60,"props":178,"children":180},{"id":179},"workflow",[181],{"type":51,"value":182},"Workflow",{"type":45,"tag":54,"props":184,"children":185},{},[186],{"type":51,"value":187},"Complete migration tasks in order. Reference the child documents for detailed transformation patterns and control mappings.",{"type":45,"tag":189,"props":190,"children":194},"pre",{"className":191,"code":193,"language":51},[192],"language-text","Migration Progress:\n- [ ] Step 1: Prepare Blazor project\n- [ ] Step 2: Migrate static assets to wwwroot\n- [ ] Step 3: Configure _Imports.razor\n- [ ] Step 4: Configure App.razor render mode\n- [ ] Step 5: Copy\u002Frename files\n- [ ] Step 6: Transform markup to Blazor\n- [ ] Step 7: Transform code-behind\n- [ ] Step 8: Build and validate\n",[195],{"type":45,"tag":72,"props":196,"children":198},{"__ignoreMap":197},"",[199],{"type":51,"value":193},{"type":45,"tag":174,"props":201,"children":202},{},[],{"type":45,"tag":60,"props":204,"children":206},{"id":205},"step-1-prepare-blazor-project",[207],{"type":51,"value":208},"Step 1: Prepare Blazor Project",{"type":45,"tag":54,"props":210,"children":211},{},[212],{"type":51,"value":213},"Inspect the workspace and user intent to determine the migration approach automatically:",{"type":45,"tag":54,"props":215,"children":216},{},[217],{"type":45,"tag":90,"props":218,"children":219},{},[220],{"type":51,"value":221},"Check for explicit user instruction:",{"type":45,"tag":223,"props":224,"children":225},"ul",{},[226,237,247],{"type":45,"tag":227,"props":228,"children":229},"li",{},[230,232],{"type":51,"value":231},"If user explicitly requested creating a new Blazor project → use ",{"type":45,"tag":90,"props":233,"children":234},{},[235],{"type":51,"value":236},"side-by-side migration",{"type":45,"tag":227,"props":238,"children":239},{},[240,242],{"type":51,"value":241},"If user explicitly requested converting the project in place → use ",{"type":45,"tag":90,"props":243,"children":244},{},[245],{"type":51,"value":246},"in-place migration",{"type":45,"tag":227,"props":248,"children":249},{},[250],{"type":51,"value":251},"If user requested moving\u002Fmigrating specific pages without mentioning a new project → check workspace context (next)",{"type":45,"tag":54,"props":253,"children":254},{},[255],{"type":45,"tag":90,"props":256,"children":257},{},[258],{"type":51,"value":259},"If user intent is unclear, check workspace:",{"type":45,"tag":261,"props":262,"children":263},"ol",{},[264,277,288],{"type":45,"tag":227,"props":265,"children":266},{},[267,269,275],{"type":51,"value":268},"Search the solution for existing Blazor projects (projects with ",{"type":45,"tag":72,"props":270,"children":272},{"className":271},[],[273],{"type":51,"value":274},"\u003CProject Sdk=\"Microsoft.NET.Sdk.Web\">",{"type":51,"value":276}," and Blazor framework references)",{"type":45,"tag":227,"props":278,"children":279},{},[280,282,286],{"type":51,"value":281},"If no Blazor project exists in the solution → use ",{"type":45,"tag":90,"props":283,"children":284},{},[285],{"type":51,"value":236},{"type":51,"value":287}," (create new project)",{"type":45,"tag":227,"props":289,"children":290},{},[291,293,297],{"type":51,"value":292},"If a Blazor project already exists → use ",{"type":45,"tag":90,"props":294,"children":295},{},[296],{"type":51,"value":246},{"type":51,"value":298}," (migrate into existing project)",{"type":45,"tag":54,"props":300,"children":301},{},[302],{"type":45,"tag":90,"props":303,"children":304},{},[305],{"type":51,"value":306},"Apply the determined approach:",{"type":45,"tag":54,"props":308,"children":309},{},[310],{"type":45,"tag":90,"props":311,"children":312},{},[313],{"type":51,"value":314},"For side-by-side migration:",{"type":45,"tag":189,"props":316,"children":320},{"className":317,"code":318,"language":319,"meta":197,"style":197},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet new blazor -n MyBlazorApp --interactivity Server\n","bash",[321],{"type":45,"tag":72,"props":322,"children":323},{"__ignoreMap":197},[324],{"type":45,"tag":325,"props":326,"children":328},"span",{"class":327,"line":30},"line",[329,335,341,346,351,356,361],{"type":45,"tag":325,"props":330,"children":332},{"style":331},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[333],{"type":51,"value":334},"dotnet",{"type":45,"tag":325,"props":336,"children":338},{"style":337},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[339],{"type":51,"value":340}," new",{"type":45,"tag":325,"props":342,"children":343},{"style":337},[344],{"type":51,"value":345}," blazor",{"type":45,"tag":325,"props":347,"children":348},{"style":337},[349],{"type":51,"value":350}," -n",{"type":45,"tag":325,"props":352,"children":353},{"style":337},[354],{"type":51,"value":355}," MyBlazorApp",{"type":45,"tag":325,"props":357,"children":358},{"style":337},[359],{"type":51,"value":360}," --interactivity",{"type":45,"tag":325,"props":362,"children":363},{"style":337},[364],{"type":51,"value":365}," Server\n",{"type":45,"tag":54,"props":367,"children":368},{},[369],{"type":45,"tag":90,"props":370,"children":371},{},[372],{"type":51,"value":373},"For in-place migration:",{"type":45,"tag":261,"props":375,"children":376},{},[377,382,387,427,440],{"type":45,"tag":227,"props":378,"children":379},{},[380],{"type":51,"value":381},"Identify the target project (existing Blazor project, or the WebForms project being converted)",{"type":45,"tag":227,"props":383,"children":384},{},[385],{"type":51,"value":386},"If converting a WebForms project, ensure it is SDK-style and targets .NET 6+ first (use the SDK-style conversion skill if needed)",{"type":45,"tag":227,"props":388,"children":389},{},[390,392],{"type":51,"value":391},"Add the Blazor framework reference to the project file:\n",{"type":45,"tag":189,"props":393,"children":397},{"className":394,"code":395,"language":396,"meta":197,"style":197},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CItemGroup>\n  \u003CFrameworkReference Include=\"Microsoft.AspNetCore.App\" \u002F>\n\u003C\u002FItemGroup>\n","xml",[398],{"type":45,"tag":72,"props":399,"children":400},{"__ignoreMap":197},[401,409,418],{"type":45,"tag":325,"props":402,"children":403},{"class":327,"line":30},[404],{"type":45,"tag":325,"props":405,"children":406},{},[407],{"type":51,"value":408},"\u003CItemGroup>\n",{"type":45,"tag":325,"props":410,"children":412},{"class":327,"line":411},2,[413],{"type":45,"tag":325,"props":414,"children":415},{},[416],{"type":51,"value":417},"  \u003CFrameworkReference Include=\"Microsoft.AspNetCore.App\" \u002F>\n",{"type":45,"tag":325,"props":419,"children":421},{"class":327,"line":420},3,[422],{"type":45,"tag":325,"props":423,"children":424},{},[425],{"type":51,"value":426},"\u003C\u002FItemGroup>\n",{"type":45,"tag":227,"props":428,"children":429},{},[430,432,438],{"type":51,"value":431},"Create or update ",{"type":45,"tag":72,"props":433,"children":435},{"className":434},[],[436],{"type":51,"value":437},"Program.cs",{"type":51,"value":439}," with standard Blazor Server hosting setup if not already present",{"type":45,"tag":227,"props":441,"children":442},{},[443,445,451,453,459],{"type":51,"value":444},"Add ",{"type":45,"tag":72,"props":446,"children":448},{"className":447},[],[449],{"type":51,"value":450},"App.razor",{"type":51,"value":452},", ",{"type":45,"tag":72,"props":454,"children":456},{"className":455},[],[457],{"type":51,"value":458},"_Imports.razor",{"type":51,"value":460},", and a layout file if they don't exist",{"type":45,"tag":462,"props":463,"children":465},"h3",{"id":464},"database-provider-detection-if-using-entity-framework",[466],{"type":51,"value":467},"Database Provider Detection (If Using Entity Framework)",{"type":45,"tag":54,"props":469,"children":470},{},[471,473,479,481,487],{"type":51,"value":472},"If the Web Forms project has a ",{"type":45,"tag":72,"props":474,"children":476},{"className":475},[],[477],{"type":51,"value":478},"Models\u002F",{"type":51,"value":480}," directory or uses Entity Framework, check the ",{"type":45,"tag":72,"props":482,"children":484},{"className":483},[],[485],{"type":51,"value":486},"Web.config",{"type":51,"value":488}," connection strings to determine the database provider:",{"type":45,"tag":98,"props":490,"children":491},{},[492,513],{"type":45,"tag":102,"props":493,"children":494},{},[495],{"type":45,"tag":106,"props":496,"children":497},{},[498,503,508],{"type":45,"tag":110,"props":499,"children":500},{},[501],{"type":51,"value":502},"Web.config Indicator",{"type":45,"tag":110,"props":504,"children":505},{},[506],{"type":51,"value":507},"Database Provider",{"type":45,"tag":110,"props":509,"children":510},{},[511],{"type":51,"value":512},"EF Core Package to Install",{"type":45,"tag":121,"props":514,"children":515},{},[516,542,568,594],{"type":45,"tag":106,"props":517,"children":518},{},[519,528,533],{"type":45,"tag":128,"props":520,"children":521},{},[522],{"type":45,"tag":72,"props":523,"children":525},{"className":524},[],[526],{"type":51,"value":527},"providerName=\"System.Data.SqlClient\"",{"type":45,"tag":128,"props":529,"children":530},{},[531],{"type":51,"value":532},"SQL Server",{"type":45,"tag":128,"props":534,"children":535},{},[536],{"type":45,"tag":72,"props":537,"children":539},{"className":538},[],[540],{"type":51,"value":541},"Microsoft.EntityFrameworkCore.SqlServer",{"type":45,"tag":106,"props":543,"children":544},{},[545,554,559],{"type":45,"tag":128,"props":546,"children":547},{},[548],{"type":45,"tag":72,"props":549,"children":551},{"className":550},[],[552],{"type":51,"value":553},"providerName=\"System.Data.SQLite\"",{"type":45,"tag":128,"props":555,"children":556},{},[557],{"type":51,"value":558},"SQLite",{"type":45,"tag":128,"props":560,"children":561},{},[562],{"type":45,"tag":72,"props":563,"children":565},{"className":564},[],[566],{"type":51,"value":567},"Microsoft.EntityFrameworkCore.Sqlite",{"type":45,"tag":106,"props":569,"children":570},{},[571,580,585],{"type":45,"tag":128,"props":572,"children":573},{},[574],{"type":45,"tag":72,"props":575,"children":577},{"className":576},[],[578],{"type":51,"value":579},"providerName=\"Npgsql\"",{"type":45,"tag":128,"props":581,"children":582},{},[583],{"type":51,"value":584},"PostgreSQL",{"type":45,"tag":128,"props":586,"children":587},{},[588],{"type":45,"tag":72,"props":589,"children":591},{"className":590},[],[592],{"type":51,"value":593},"Npgsql.EntityFrameworkCore.PostgreSQL",{"type":45,"tag":106,"props":595,"children":596},{},[597,606,611],{"type":45,"tag":128,"props":598,"children":599},{},[600],{"type":45,"tag":72,"props":601,"children":603},{"className":602},[],[604],{"type":51,"value":605},"providerName=\"MySql.Data.MySqlClient\"",{"type":45,"tag":128,"props":607,"children":608},{},[609],{"type":51,"value":610},"MySQL",{"type":45,"tag":128,"props":612,"children":613},{},[614],{"type":45,"tag":72,"props":615,"children":617},{"className":616},[],[618],{"type":51,"value":619},"Pomelo.EntityFrameworkCore.MySql",{"type":45,"tag":54,"props":621,"children":622},{},[623],{"type":45,"tag":90,"props":624,"children":625},{},[626],{"type":51,"value":627},"Add the detected provider to your Blazor project:",{"type":45,"tag":189,"props":629,"children":631},{"className":317,"code":630,"language":319,"meta":197,"style":197},"# Example for SQL Server\ndotnet add package Microsoft.EntityFrameworkCore.SqlServer\ndotnet add package Microsoft.EntityFrameworkCore.Tools\n",[632],{"type":45,"tag":72,"props":633,"children":634},{"__ignoreMap":197},[635,644,666],{"type":45,"tag":325,"props":636,"children":637},{"class":327,"line":30},[638],{"type":45,"tag":325,"props":639,"children":641},{"style":640},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[642],{"type":51,"value":643},"# Example for SQL Server\n",{"type":45,"tag":325,"props":645,"children":646},{"class":327,"line":411},[647,651,656,661],{"type":45,"tag":325,"props":648,"children":649},{"style":331},[650],{"type":51,"value":334},{"type":45,"tag":325,"props":652,"children":653},{"style":337},[654],{"type":51,"value":655}," add",{"type":45,"tag":325,"props":657,"children":658},{"style":337},[659],{"type":51,"value":660}," package",{"type":45,"tag":325,"props":662,"children":663},{"style":337},[664],{"type":51,"value":665}," Microsoft.EntityFrameworkCore.SqlServer\n",{"type":45,"tag":325,"props":667,"children":668},{"class":327,"line":420},[669,673,677,681],{"type":45,"tag":325,"props":670,"children":671},{"style":331},[672],{"type":51,"value":334},{"type":45,"tag":325,"props":674,"children":675},{"style":337},[676],{"type":51,"value":655},{"type":45,"tag":325,"props":678,"children":679},{"style":337},[680],{"type":51,"value":660},{"type":45,"tag":325,"props":682,"children":683},{"style":337},[684],{"type":51,"value":685}," Microsoft.EntityFrameworkCore.Tools\n",{"type":45,"tag":54,"props":687,"children":688},{},[689,694,696,701],{"type":45,"tag":90,"props":690,"children":691},{},[692],{"type":51,"value":693},"Important:",{"type":51,"value":695}," Use the ",{"type":45,"tag":90,"props":697,"children":698},{},[699],{"type":51,"value":700},"same database provider",{"type":51,"value":702}," as the original Web Forms project. Do not change providers (e.g., SQL Server → SQLite) unless explicitly required, as this can cause data type compatibility issues.",{"type":45,"tag":174,"props":704,"children":705},{},[],{"type":45,"tag":60,"props":707,"children":709},{"id":708},"step-2-migrate-static-assets-to-wwwroot",[710],{"type":51,"value":711},"Step 2: Migrate Static Assets to wwwroot",{"type":45,"tag":54,"props":713,"children":714},{},[715,727],{"type":45,"tag":90,"props":716,"children":717},{},[718,720,725],{"type":51,"value":719},"Execute the ",{"type":45,"tag":72,"props":721,"children":723},{"className":722},[],[724],{"type":51,"value":167},{"type":51,"value":726}," skill",{"type":51,"value":728}," to migrate Content\u002FScripts\u002FImages to wwwroot. Complete all steps in that skill, then return here for Blazor-specific additions. That skill handles:",{"type":45,"tag":223,"props":730,"children":731},{},[732,737,742,747,752,757],{"type":45,"tag":227,"props":733,"children":734},{},[735],{"type":51,"value":736},"Content\u002FScripts\u002FImages folders to wwwroot\u002Fcss\u002Fjs\u002Fimages migration",{"type":45,"tag":227,"props":738,"children":739},{},[740],{"type":51,"value":741},"wwwroot directory structure creation",{"type":45,"tag":227,"props":743,"children":744},{},[745],{"type":51,"value":746},"UseStaticFiles middleware configuration",{"type":45,"tag":227,"props":748,"children":749},{},[750],{"type":51,"value":751},"Path reference updates in views and code",{"type":45,"tag":227,"props":753,"children":754},{},[755],{"type":51,"value":756},"VirtualPathProvider to IFileProvider replacement",{"type":45,"tag":227,"props":758,"children":759},{},[760],{"type":51,"value":761},"Files outside wwwroot configuration",{"type":45,"tag":54,"props":763,"children":764},{},[765],{"type":45,"tag":90,"props":766,"children":767},{},[768],{"type":51,"value":769},"After completing the static file migration skill, apply these Blazor-specific additions:",{"type":45,"tag":261,"props":771,"children":772},{},[773],{"type":45,"tag":227,"props":774,"children":775},{},[776,788,790,794,796,802,804,810,812,818,820,825,827,832,834,840,842],{"type":45,"tag":90,"props":777,"children":778},{},[779,781,786],{"type":51,"value":780},"Add CSS\u002FJS references to ",{"type":45,"tag":72,"props":782,"children":784},{"className":783},[],[785],{"type":51,"value":450},{"type":51,"value":787}," preserving bundle order",{"type":51,"value":789},":",{"type":45,"tag":791,"props":792,"children":793},"br",{},[],{"type":51,"value":795},"CSS order matters for cascade rules. Check ",{"type":45,"tag":72,"props":797,"children":799},{"className":798},[],[800],{"type":51,"value":801},"App_Start\u002FBundleConfig.cs",{"type":51,"value":803}," for the StyleBundle's ",{"type":45,"tag":72,"props":805,"children":807},{"className":806},[],[808],{"type":51,"value":809},".Include()",{"type":51,"value":811}," calls and add ",{"type":45,"tag":72,"props":813,"children":815},{"className":814},[],[816],{"type":51,"value":817},"\u003Clink>",{"type":51,"value":819}," tags in ",{"type":45,"tag":72,"props":821,"children":823},{"className":822},[],[824],{"type":51,"value":450},{"type":51,"value":826}," ",{"type":45,"tag":90,"props":828,"children":829},{},[830],{"type":51,"value":831},"in the same order",{"type":51,"value":833},". Verify all referenced CSS files exist in ",{"type":45,"tag":72,"props":835,"children":837},{"className":836},[],[838],{"type":51,"value":839},"wwwroot\u002Fcss\u002F",{"type":51,"value":841},".",{"type":45,"tag":189,"props":843,"children":847},{"className":844,"code":845,"language":846,"meta":197,"style":197},"language-razor shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n    \u003C!-- Original site stylesheets - preserve BundleConfig.cs order -->\n    \u003Clink rel=\"stylesheet\" href=\"css\u002Fbootstrap.min.css\" \u002F>\n    \u003Clink rel=\"stylesheet\" href=\"css\u002FSite.css\" \u002F>\n\u003C\u002Fhead>\n\u003Cbody>\n    \u003C!-- Original site scripts -->\n    \u003Cscript src=\"js\u002Fjquery-3.7.1.min.js\">\u003C\u002Fscript>\n    \u003Cscript src=\"js\u002Fbootstrap.bundle.min.js\">\u003C\u002Fscript>\n    \u003Cscript src=\"js\u002FSite.js\">\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","razor",[848],{"type":45,"tag":72,"props":849,"children":850},{"__ignoreMap":197},[851,859,867,875,884,893,902,910,919,928,937,946,955,964],{"type":45,"tag":325,"props":852,"children":853},{"class":327,"line":30},[854],{"type":45,"tag":325,"props":855,"children":856},{},[857],{"type":51,"value":858},"\u003C!DOCTYPE html>\n",{"type":45,"tag":325,"props":860,"children":861},{"class":327,"line":411},[862],{"type":45,"tag":325,"props":863,"children":864},{},[865],{"type":51,"value":866},"\u003Chtml>\n",{"type":45,"tag":325,"props":868,"children":869},{"class":327,"line":420},[870],{"type":45,"tag":325,"props":871,"children":872},{},[873],{"type":51,"value":874},"\u003Chead>\n",{"type":45,"tag":325,"props":876,"children":878},{"class":327,"line":877},4,[879],{"type":45,"tag":325,"props":880,"children":881},{},[882],{"type":51,"value":883},"    \u003C!-- Original site stylesheets - preserve BundleConfig.cs order -->\n",{"type":45,"tag":325,"props":885,"children":887},{"class":327,"line":886},5,[888],{"type":45,"tag":325,"props":889,"children":890},{},[891],{"type":51,"value":892},"    \u003Clink rel=\"stylesheet\" href=\"css\u002Fbootstrap.min.css\" \u002F>\n",{"type":45,"tag":325,"props":894,"children":896},{"class":327,"line":895},6,[897],{"type":45,"tag":325,"props":898,"children":899},{},[900],{"type":51,"value":901},"    \u003Clink rel=\"stylesheet\" href=\"css\u002FSite.css\" \u002F>\n",{"type":45,"tag":325,"props":903,"children":904},{"class":327,"line":26},[905],{"type":45,"tag":325,"props":906,"children":907},{},[908],{"type":51,"value":909},"\u003C\u002Fhead>\n",{"type":45,"tag":325,"props":911,"children":913},{"class":327,"line":912},8,[914],{"type":45,"tag":325,"props":915,"children":916},{},[917],{"type":51,"value":918},"\u003Cbody>\n",{"type":45,"tag":325,"props":920,"children":922},{"class":327,"line":921},9,[923],{"type":45,"tag":325,"props":924,"children":925},{},[926],{"type":51,"value":927},"    \u003C!-- Original site scripts -->\n",{"type":45,"tag":325,"props":929,"children":931},{"class":327,"line":930},10,[932],{"type":45,"tag":325,"props":933,"children":934},{},[935],{"type":51,"value":936},"    \u003Cscript src=\"js\u002Fjquery-3.7.1.min.js\">\u003C\u002Fscript>\n",{"type":45,"tag":325,"props":938,"children":940},{"class":327,"line":939},11,[941],{"type":45,"tag":325,"props":942,"children":943},{},[944],{"type":51,"value":945},"    \u003Cscript src=\"js\u002Fbootstrap.bundle.min.js\">\u003C\u002Fscript>\n",{"type":45,"tag":325,"props":947,"children":949},{"class":327,"line":948},12,[950],{"type":45,"tag":325,"props":951,"children":952},{},[953],{"type":51,"value":954},"    \u003Cscript src=\"js\u002FSite.js\">\u003C\u002Fscript>\n",{"type":45,"tag":325,"props":956,"children":958},{"class":327,"line":957},13,[959],{"type":45,"tag":325,"props":960,"children":961},{},[962],{"type":51,"value":963},"\u003C\u002Fbody>\n",{"type":45,"tag":325,"props":965,"children":967},{"class":327,"line":966},14,[968],{"type":45,"tag":325,"props":969,"children":970},{},[971],{"type":51,"value":972},"\u003C\u002Fhtml>\n",{"type":45,"tag":974,"props":975,"children":976},"blockquote",{},[977],{"type":45,"tag":54,"props":978,"children":979},{},[980,982,987,989,995,997,1003,1005,1011,1013,1018],{"type":51,"value":981},"⚠️ ",{"type":45,"tag":90,"props":983,"children":984},{},[985],{"type":51,"value":986},"WARNING:",{"type":51,"value":988}," The ",{"type":45,"tag":72,"props":990,"children":992},{"className":991},[],[993],{"type":51,"value":994},"bootstrap",{"type":51,"value":996}," NuGet package does not expose files through ",{"type":45,"tag":72,"props":998,"children":1000},{"className":999},[],[1001],{"type":51,"value":1002},"_content\u002Fbootstrap\u002F",{"type":51,"value":1004}," in Blazor Server. Copy Bootstrap files from the original ",{"type":45,"tag":72,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":51,"value":1010},"Content\u002F",{"type":51,"value":1012}," folder to ",{"type":45,"tag":72,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":51,"value":839},{"type":51,"value":1019}," to preserve the exact version and avoid class name changes required by version upgrades.",{"type":45,"tag":54,"props":1021,"children":1022},{},[1023,1028,1030,1036,1037,1043,1044,1050,1051,1057,1059,1065],{"type":45,"tag":90,"props":1024,"children":1025},{},[1026],{"type":51,"value":1027},"Search for additional static asset folders",{"type":51,"value":1029}," beyond Content\u002FScripts\u002FImages (e.g., ",{"type":45,"tag":72,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":51,"value":1035},"Pics",{"type":51,"value":452},{"type":45,"tag":72,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":51,"value":1042},"Files",{"type":51,"value":452},{"type":45,"tag":72,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":51,"value":1049},"Uploads",{"type":51,"value":452},{"type":45,"tag":72,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":51,"value":1056},"Documents",{"type":51,"value":1058},"). Check for image\u002Fdocument file types and hardcoded paths in service classes, then migrate any found folders to ",{"type":45,"tag":72,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":51,"value":1064},"wwwroot\u002F",{"type":51,"value":1066}," preserving their names.",{"type":45,"tag":174,"props":1068,"children":1069},{},[],{"type":45,"tag":60,"props":1071,"children":1073},{"id":1072},"step-3-configure-_importsrazor",[1074,1076],{"type":51,"value":1075},"Step 3: Configure ",{"type":45,"tag":72,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":51,"value":458},{"type":45,"tag":189,"props":1082,"children":1084},{"className":844,"code":1083,"language":846,"meta":197,"style":197},"@using Microsoft.AspNetCore.Components\n@using Microsoft.AspNetCore.Components.Web\n@using static Microsoft.AspNetCore.Components.Web.RenderMode\n",[1085],{"type":45,"tag":72,"props":1086,"children":1087},{"__ignoreMap":197},[1088,1096,1104],{"type":45,"tag":325,"props":1089,"children":1090},{"class":327,"line":30},[1091],{"type":45,"tag":325,"props":1092,"children":1093},{},[1094],{"type":51,"value":1095},"@using Microsoft.AspNetCore.Components\n",{"type":45,"tag":325,"props":1097,"children":1098},{"class":327,"line":411},[1099],{"type":45,"tag":325,"props":1100,"children":1101},{},[1102],{"type":51,"value":1103},"@using Microsoft.AspNetCore.Components.Web\n",{"type":45,"tag":325,"props":1105,"children":1106},{"class":327,"line":420},[1107],{"type":45,"tag":325,"props":1108,"children":1109},{},[1110],{"type":51,"value":1111},"@using static Microsoft.AspNetCore.Components.Web.RenderMode\n",{"type":45,"tag":974,"props":1113,"children":1114},{},[1115],{"type":45,"tag":54,"props":1116,"children":1117},{},[1118,1123,1124,1130,1132,1138,1140,1145,1147,1152,1154,1160,1162,1167,1169,1175],{"type":45,"tag":90,"props":1119,"children":1120},{},[1121],{"type":51,"value":1122},"Note:",{"type":51,"value":988},{"type":45,"tag":72,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":51,"value":1129},"@using static",{"type":51,"value":1131}," import lets you write ",{"type":45,"tag":72,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":51,"value":1137},"InteractiveServer",{"type":51,"value":1139}," as shorthand in ",{"type":45,"tag":72,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":51,"value":450},{"type":51,"value":1146},". Do ",{"type":45,"tag":90,"props":1148,"children":1149},{},[1150],{"type":51,"value":1151},"not",{"type":51,"value":1153}," add ",{"type":45,"tag":72,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":51,"value":1159},"@rendermode InteractiveServer",{"type":51,"value":1161}," as a line in ",{"type":45,"tag":72,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":51,"value":458},{"type":51,"value":1168}," — ",{"type":45,"tag":72,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":51,"value":1174},"@rendermode",{"type":51,"value":1176}," is a directive attribute that belongs on component instances, not a standalone directive.",{"type":45,"tag":174,"props":1178,"children":1179},{},[],{"type":45,"tag":60,"props":1181,"children":1183},{"id":1182},"step-4-configure-render-mode-in-apprazor",[1184,1186],{"type":51,"value":1185},"Step 4: Configure Render Mode in ",{"type":45,"tag":72,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":51,"value":450},{"type":45,"tag":54,"props":1192,"children":1193},{},[1194,1196,1202,1204,1209],{"type":51,"value":1195},"The ",{"type":45,"tag":72,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":51,"value":1201},"dotnet new blazor --interactivity Server",{"type":51,"value":1203}," template generates ",{"type":45,"tag":72,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":51,"value":450},{"type":51,"value":1210}," with render mode already set. Verify it contains:",{"type":45,"tag":189,"props":1212,"children":1214},{"className":844,"code":1213,"language":846,"meta":197,"style":197},"\u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\n...\n\u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\n",[1215],{"type":45,"tag":72,"props":1216,"children":1217},{"__ignoreMap":197},[1218,1226,1234],{"type":45,"tag":325,"props":1219,"children":1220},{"class":327,"line":30},[1221],{"type":45,"tag":325,"props":1222,"children":1223},{},[1224],{"type":51,"value":1225},"\u003CHeadOutlet @rendermode=\"InteractiveServer\" \u002F>\n",{"type":45,"tag":325,"props":1227,"children":1228},{"class":327,"line":411},[1229],{"type":45,"tag":325,"props":1230,"children":1231},{},[1232],{"type":51,"value":1233},"...\n",{"type":45,"tag":325,"props":1235,"children":1236},{"class":327,"line":420},[1237],{"type":45,"tag":325,"props":1238,"children":1239},{},[1240],{"type":51,"value":1241},"\u003CRoutes @rendermode=\"InteractiveServer\" \u002F>\n",{"type":45,"tag":54,"props":1243,"children":1244},{},[1245,1247,1256],{"type":51,"value":1246},"This enables global server interactivity for all pages. See ",{"type":45,"tag":1248,"props":1249,"children":1253},"a",{"href":1250,"rel":1251},"https:\u002F\u002Flearn.microsoft.com\u002Faspnet\u002Fcore\u002Fblazor\u002Fcomponents\u002Frender-modes",[1252],"nofollow",[1254],{"type":51,"value":1255},"ASP.NET Core Blazor render modes",{"type":51,"value":1257}," for per-page alternatives.",{"type":45,"tag":174,"props":1259,"children":1260},{},[],{"type":45,"tag":60,"props":1262,"children":1264},{"id":1263},"step-5-copymove-and-rename-files",[1265],{"type":51,"value":1266},"Step 5: Copy\u002FMove and Rename Files",{"type":45,"tag":54,"props":1268,"children":1269},{},[1270],{"type":51,"value":1271},"Based on the migration approach determined in Step 1:",{"type":45,"tag":54,"props":1273,"children":1274},{},[1275,1279,1281,1287,1289,1295,1297,1303],{"type":45,"tag":90,"props":1276,"children":1277},{},[1278],{"type":51,"value":314},{"type":51,"value":1280}," Copy files from the WebForms project to the Blazor project and rename them. Place them in the Blazor project respecting Blazor conventions (pages in ",{"type":45,"tag":72,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":51,"value":1286},"\u002FComponents\u002FPages\u002F",{"type":51,"value":1288},", layouts in ",{"type":45,"tag":72,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":51,"value":1294},"\u002FComponents\u002FLayout\u002F",{"type":51,"value":1296},", shared components in ",{"type":45,"tag":72,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":51,"value":1302},"\u002FComponents\u002F",{"type":51,"value":1304},").",{"type":45,"tag":54,"props":1306,"children":1307},{},[1308,1312],{"type":45,"tag":90,"props":1309,"children":1310},{},[1311],{"type":51,"value":373},{"type":51,"value":1313}," Rename files in place within the same project. They can stay in their current locations initially.",{"type":45,"tag":98,"props":1315,"children":1316},{},[1317,1338],{"type":45,"tag":102,"props":1318,"children":1319},{},[1320],{"type":45,"tag":106,"props":1321,"children":1322},{},[1323,1328,1333],{"type":45,"tag":110,"props":1324,"children":1325},{},[1326],{"type":51,"value":1327},"Original",{"type":45,"tag":110,"props":1329,"children":1330},{},[1331],{"type":51,"value":1332},"New Name",{"type":45,"tag":110,"props":1334,"children":1335},{},[1336],{"type":51,"value":1337},"Notes",{"type":45,"tag":121,"props":1339,"children":1340},{},[1341,1367,1393,1419,1445,1471],{"type":45,"tag":106,"props":1342,"children":1343},{},[1344,1353,1362],{"type":45,"tag":128,"props":1345,"children":1346},{},[1347],{"type":45,"tag":72,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":51,"value":1352},"MyPage.aspx",{"type":45,"tag":128,"props":1354,"children":1355},{},[1356],{"type":45,"tag":72,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":51,"value":1361},"MyPage.razor",{"type":45,"tag":128,"props":1363,"children":1364},{},[1365],{"type":51,"value":1366},"Page markup",{"type":45,"tag":106,"props":1368,"children":1369},{},[1370,1379,1388],{"type":45,"tag":128,"props":1371,"children":1372},{},[1373],{"type":45,"tag":72,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":51,"value":1378},"MyPage.aspx.cs",{"type":45,"tag":128,"props":1380,"children":1381},{},[1382],{"type":45,"tag":72,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":51,"value":1387},"MyPage.razor.cs",{"type":45,"tag":128,"props":1389,"children":1390},{},[1391],{"type":51,"value":1392},"Code-behind (keep as partial class)",{"type":45,"tag":106,"props":1394,"children":1395},{},[1396,1405,1414],{"type":45,"tag":128,"props":1397,"children":1398},{},[1399],{"type":45,"tag":72,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":51,"value":1404},"MyControl.ascx",{"type":45,"tag":128,"props":1406,"children":1407},{},[1408],{"type":45,"tag":72,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":51,"value":1413},"MyControl.razor",{"type":45,"tag":128,"props":1415,"children":1416},{},[1417],{"type":51,"value":1418},"User control markup",{"type":45,"tag":106,"props":1420,"children":1421},{},[1422,1431,1440],{"type":45,"tag":128,"props":1423,"children":1424},{},[1425],{"type":45,"tag":72,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":51,"value":1430},"MyControl.ascx.cs",{"type":45,"tag":128,"props":1432,"children":1433},{},[1434],{"type":45,"tag":72,"props":1435,"children":1437},{"className":1436},[],[1438],{"type":51,"value":1439},"MyControl.razor.cs",{"type":45,"tag":128,"props":1441,"children":1442},{},[1443],{"type":51,"value":1444},"User control code-behind",{"type":45,"tag":106,"props":1446,"children":1447},{},[1448,1457,1466],{"type":45,"tag":128,"props":1449,"children":1450},{},[1451],{"type":45,"tag":72,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":51,"value":1456},"Site.Master",{"type":45,"tag":128,"props":1458,"children":1459},{},[1460],{"type":45,"tag":72,"props":1461,"children":1463},{"className":1462},[],[1464],{"type":51,"value":1465},"MainLayout.razor",{"type":45,"tag":128,"props":1467,"children":1468},{},[1469],{"type":51,"value":1470},"Master page → Layout",{"type":45,"tag":106,"props":1472,"children":1473},{},[1474,1483,1492],{"type":45,"tag":128,"props":1475,"children":1476},{},[1477],{"type":45,"tag":72,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":51,"value":1482},"Site.Master.cs",{"type":45,"tag":128,"props":1484,"children":1485},{},[1486],{"type":45,"tag":72,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":51,"value":1491},"MainLayout.razor.cs",{"type":45,"tag":128,"props":1493,"children":1494},{},[1495],{"type":51,"value":1496},"Layout code-behind",{"type":45,"tag":462,"props":1498,"children":1500},{"id":1499},"additional-files-to-copy",[1501],{"type":51,"value":1502},"Additional Files to Copy",{"type":45,"tag":54,"props":1504,"children":1505},{},[1506,1511,1513,1518,1519,1525,1526,1532,1534,1540,1542,1548],{"type":45,"tag":90,"props":1507,"children":1508},{},[1509],{"type":51,"value":1510},"Models and Business Logic directories:",{"type":51,"value":1512},"\nIf the WebForms project has ",{"type":45,"tag":72,"props":1514,"children":1516},{"className":1515},[],[1517],{"type":51,"value":478},{"type":51,"value":452},{"type":45,"tag":72,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":51,"value":1524},"BLL\u002F",{"type":51,"value":452},{"type":45,"tag":72,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":51,"value":1531},"BusinessLogic\u002F",{"type":51,"value":1533},", or ",{"type":45,"tag":72,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":51,"value":1539},"Services\u002F",{"type":51,"value":1541}," folders, copy all ",{"type":45,"tag":72,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":51,"value":1547},".cs",{"type":51,"value":1549}," files to the Blazor project preserving directory structure.",{"type":45,"tag":974,"props":1551,"children":1552},{},[1553,1573],{"type":45,"tag":54,"props":1554,"children":1555},{},[1556,1561,1563,1571],{"type":45,"tag":90,"props":1557,"children":1558},{},[1559],{"type":51,"value":1560},"Data layer migration:",{"type":51,"value":1562}," EF6 namespace updates, DbContext configuration, connection strings, and session state migration are handled by ",{"type":45,"tag":90,"props":1564,"children":1565},{},[1566],{"type":45,"tag":72,"props":1567,"children":1569},{"className":1568},[],[1570],{"type":51,"value":151},{"type":51,"value":1572},". Execute that skill when:",{"type":45,"tag":223,"props":1574,"children":1575},{},[1576,1589,1594,1599],{"type":45,"tag":227,"props":1577,"children":1578},{},[1579,1581,1587],{"type":51,"value":1580},"Build errors reference ",{"type":45,"tag":72,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":51,"value":1586},"System.Data.Entity",{"type":51,"value":1588}," namespaces",{"type":45,"tag":227,"props":1590,"children":1591},{},[1592],{"type":51,"value":1593},"User asks about data access, Entity Framework, or database setup",{"type":45,"tag":227,"props":1595,"children":1596},{},[1597],{"type":51,"value":1598},"Session state or shopping cart functionality needs migration",{"type":45,"tag":227,"props":1600,"children":1601},{},[1602],{"type":51,"value":1603},"After markup migration is complete (if deferring data concerns)",{"type":45,"tag":174,"props":1605,"children":1606},{},[],{"type":45,"tag":60,"props":1608,"children":1610},{"id":1609},"step-6-transform-markup-to-blazor-components",[1611],{"type":51,"value":1612},"Step 6: Transform Markup to Blazor Components",{"type":45,"tag":54,"props":1614,"children":1615},{},[1616,1618,1624],{"type":51,"value":1617},"Apply these mechanical transformations to each ",{"type":45,"tag":72,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":51,"value":1623},".razor",{"type":51,"value":1625}," file:",{"type":45,"tag":54,"props":1627,"children":1628},{},[1629],{"type":45,"tag":90,"props":1630,"children":1631},{},[1632],{"type":51,"value":1633},"Control conversions (native HTML\u002FBlazor):",{"type":45,"tag":223,"props":1635,"children":1636},{},[1637,1664,1680,1696,1712,1746,1771,1803,1821,1853,1876],{"type":45,"tag":227,"props":1638,"children":1639},{},[1640,1646,1648,1654,1656,1662],{"type":45,"tag":72,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":51,"value":1645},"\u003Casp:Label>",{"type":51,"value":1647}," → ",{"type":45,"tag":72,"props":1649,"children":1651},{"className":1650},[],[1652],{"type":51,"value":1653},"\u003Clabel>",{"type":51,"value":1655}," or ",{"type":45,"tag":72,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":51,"value":1661},"@value",{"type":51,"value":1663}," inline",{"type":45,"tag":227,"props":1665,"children":1666},{},[1667,1673,1674],{"type":45,"tag":72,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":51,"value":1672},"\u003Casp:TextBox>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":51,"value":1679},"\u003Cinput @bind=\"value\" \u002F>",{"type":45,"tag":227,"props":1681,"children":1682},{},[1683,1689,1690],{"type":45,"tag":72,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":51,"value":1688},"\u003Casp:Button>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":51,"value":1695},"\u003Cbutton @onclick=\"Handler\">Text\u003C\u002Fbutton>",{"type":45,"tag":227,"props":1697,"children":1698},{},[1699,1705,1706],{"type":45,"tag":72,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":51,"value":1704},"\u003Casp:DropDownList>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":51,"value":1711},"\u003Cselect @bind=\"value\">@foreach...\u003C\u002Fselect>",{"type":45,"tag":227,"props":1713,"children":1714},{},[1715,1721,1722,1728,1730,1736,1738,1744],{"type":45,"tag":72,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":51,"value":1720},"\u003Casp:GridView>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":51,"value":1727},"\u003Ctable>",{"type":51,"value":1729}," with ",{"type":45,"tag":72,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":51,"value":1735},"@foreach",{"type":51,"value":1737}," rows (or ",{"type":45,"tag":72,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":51,"value":1743},"QuickGrid",{"type":51,"value":1745}," for advanced scenarios)",{"type":45,"tag":227,"props":1747,"children":1748},{},[1749,1755,1757,1763,1764,1769],{"type":45,"tag":72,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":51,"value":1754},"\u003Casp:ListView>",{"type":51,"value":1756}," \u002F ",{"type":45,"tag":72,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":51,"value":1762},"\u003Casp:Repeater>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":51,"value":1735},{"type":51,"value":1770}," loop with custom markup",{"type":45,"tag":227,"props":1772,"children":1773},{},[1774,1780,1782,1788,1789,1795,1797],{"type":45,"tag":72,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":51,"value":1779},"\u003Casp:RequiredFieldValidator>",{"type":51,"value":1781}," etc. → ",{"type":45,"tag":72,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":51,"value":1787},"\u003CEditForm>",{"type":51,"value":1729},{"type":45,"tag":72,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":51,"value":1794},"\u003CDataAnnotationsValidator>",{"type":51,"value":1796}," and ",{"type":45,"tag":72,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":51,"value":1802},"\u003CValidationMessage For=\"...\">",{"type":45,"tag":227,"props":1804,"children":1805},{},[1806,1812,1813,1819],{"type":45,"tag":72,"props":1807,"children":1809},{"className":1808},[],[1810],{"type":51,"value":1811},"\u003Casp:Login>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1814,"children":1816},{"className":1815},[],[1817],{"type":51,"value":1818},"\u003Cform method=\"post\">",{"type":51,"value":1820}," → minimal API endpoint (see managing-blazor-server-authentication)",{"type":45,"tag":227,"props":1822,"children":1823},{},[1824,1830,1831,1837,1838,1844,1845,1851],{"type":45,"tag":72,"props":1825,"children":1827},{"className":1826},[],[1828],{"type":51,"value":1829},"\u003Casp:LoginView>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":51,"value":1836},"\u003CAuthorizeView>",{"type":51,"value":1729},{"type":45,"tag":72,"props":1839,"children":1841},{"className":1840},[],[1842],{"type":51,"value":1843},"\u003CNotAuthorized>",{"type":51,"value":1756},{"type":45,"tag":72,"props":1846,"children":1848},{"className":1847},[],[1849],{"type":51,"value":1850},"\u003CAuthorized>",{"type":51,"value":1852}," templates",{"type":45,"tag":227,"props":1854,"children":1855},{},[1856,1862,1863,1869,1871],{"type":45,"tag":72,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":51,"value":1861},"\u003Casp:LoginName>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":51,"value":1868},"@context.User.Identity?.Name",{"type":51,"value":1870}," inside ",{"type":45,"tag":72,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":51,"value":1836},{"type":45,"tag":227,"props":1877,"children":1878},{},[1879,1881,1889],{"type":51,"value":1880},"See ",{"type":45,"tag":90,"props":1882,"children":1883},{},[1884],{"type":45,"tag":1248,"props":1885,"children":1887},{"href":1886},"ref\u002Fcontrol-reference.md",[1888],{"type":51,"value":1886},{"type":51,"value":1890}," for complete mapping table",{"type":45,"tag":54,"props":1892,"children":1893},{},[1894],{"type":45,"tag":90,"props":1895,"children":1896},{},[1897],{"type":51,"value":1898},"Directive conversions:",{"type":45,"tag":223,"props":1900,"children":1901},{},[1902,1920,1936,1947,1963],{"type":45,"tag":227,"props":1903,"children":1904},{},[1905,1911,1912,1918],{"type":45,"tag":72,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":51,"value":1910},"\u003C%@ Page Title=\"X\" ... %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1913,"children":1915},{"className":1914},[],[1916],{"type":51,"value":1917},"@page \"\u002Froute\"",{"type":51,"value":1919}," (derive route from file path)",{"type":45,"tag":227,"props":1921,"children":1922},{},[1923,1929,1930],{"type":45,"tag":72,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":51,"value":1928},"\u003C%@ Master ... %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":51,"value":1935},"@inherits LayoutComponentBase",{"type":45,"tag":227,"props":1937,"children":1938},{},[1939,1945],{"type":45,"tag":72,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":51,"value":1944},"\u003C%@ Control ... %>",{"type":51,"value":1946}," → (remove entirely for user controls)",{"type":45,"tag":227,"props":1948,"children":1949},{},[1950,1956,1957],{"type":45,"tag":72,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":51,"value":1955},"\u003C%@ Import Namespace=\"X\" %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":1958,"children":1960},{"className":1959},[],[1961],{"type":51,"value":1962},"@using X",{"type":45,"tag":227,"props":1964,"children":1965},{},[1966,1968,1974,1975,1981,1982,1988,1989,1995,1996],{"type":51,"value":1967},"Remove directive attributes: ",{"type":45,"tag":72,"props":1969,"children":1971},{"className":1970},[],[1972],{"type":51,"value":1973},"AutoEventWireup",{"type":51,"value":452},{"type":45,"tag":72,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":51,"value":1980},"CodeBehind",{"type":51,"value":452},{"type":45,"tag":72,"props":1983,"children":1985},{"className":1984},[],[1986],{"type":51,"value":1987},"Inherits",{"type":51,"value":452},{"type":45,"tag":72,"props":1990,"children":1992},{"className":1991},[],[1993],{"type":51,"value":1994},"EnableViewState",{"type":51,"value":452},{"type":45,"tag":72,"props":1997,"children":1999},{"className":1998},[],[2000],{"type":51,"value":2001},"MasterPageFile",{"type":45,"tag":54,"props":2003,"children":2004},{},[2005],{"type":45,"tag":90,"props":2006,"children":2007},{},[2008],{"type":51,"value":2009},"Expression conversions:",{"type":45,"tag":223,"props":2011,"children":2012},{},[2013,2029,2044,2062,2077,2093,2109,2125],{"type":45,"tag":227,"props":2014,"children":2015},{},[2016,2022,2023],{"type":45,"tag":72,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":51,"value":2021},"\u003C%: expr %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":51,"value":2028},"@(expr)",{"type":45,"tag":227,"props":2030,"children":2031},{},[2032,2038,2039],{"type":45,"tag":72,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":51,"value":2037},"\u003C%= expr %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":51,"value":2028},{"type":45,"tag":227,"props":2045,"children":2046},{},[2047,2053,2054,2060],{"type":45,"tag":72,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":51,"value":2052},"\u003C%# Item.Property %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2055,"children":2057},{"className":2056},[],[2058],{"type":51,"value":2059},"@context.Property",{"type":51,"value":2061}," (in templates)",{"type":45,"tag":227,"props":2063,"children":2064},{},[2065,2071,2072],{"type":45,"tag":72,"props":2066,"children":2068},{"className":2067},[],[2069],{"type":51,"value":2070},"\u003C%# Eval(\"Property\") %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2073,"children":2075},{"className":2074},[],[2076],{"type":51,"value":2059},{"type":45,"tag":227,"props":2078,"children":2079},{},[2080,2086,2087],{"type":45,"tag":72,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":51,"value":2085},"\u003C%# Bind(\"Property\") %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":51,"value":2092},"@bind-Value=\"context.Property\"",{"type":45,"tag":227,"props":2094,"children":2095},{},[2096,2102,2103],{"type":45,"tag":72,"props":2097,"children":2099},{"className":2098},[],[2100],{"type":51,"value":2101},"\u003C%-- comment --%>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":51,"value":2108},"@* comment *@",{"type":45,"tag":227,"props":2110,"children":2111},{},[2112,2118,2119],{"type":45,"tag":72,"props":2113,"children":2115},{"className":2114},[],[2116],{"type":51,"value":2117},"\u003C% if (x) { %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2120,"children":2122},{"className":2121},[],[2123],{"type":51,"value":2124},"@if (x) {",{"type":45,"tag":227,"props":2126,"children":2127},{},[2128,2134,2135],{"type":45,"tag":72,"props":2129,"children":2131},{"className":2130},[],[2132],{"type":51,"value":2133},"\u003C% } %>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2136,"children":2138},{"className":2137},[],[2139],{"type":51,"value":2140},"}",{"type":45,"tag":54,"props":2142,"children":2143},{},[2144],{"type":45,"tag":90,"props":2145,"children":2146},{},[2147],{"type":51,"value":2148},"URL conversions:",{"type":45,"tag":223,"props":2150,"children":2151},{},[2152,2168,2184],{"type":45,"tag":227,"props":2153,"children":2154},{},[2155,2161,2162],{"type":45,"tag":72,"props":2156,"children":2158},{"className":2157},[],[2159],{"type":51,"value":2160},"href=\"~\u002Fpath\"",{"type":51,"value":1647},{"type":45,"tag":72,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":51,"value":2167},"href=\"\u002Fpath\"",{"type":45,"tag":227,"props":2169,"children":2170},{},[2171,2177,2178],{"type":45,"tag":72,"props":2172,"children":2174},{"className":2173},[],[2175],{"type":51,"value":2176},"NavigateUrl=\"~\u002Fpath\"",{"type":51,"value":1647},{"type":45,"tag":72,"props":2179,"children":2181},{"className":2180},[],[2182],{"type":51,"value":2183},"NavigateUrl=\"\u002Fpath\"",{"type":45,"tag":227,"props":2185,"children":2186},{},[2187,2193,2194],{"type":45,"tag":72,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":51,"value":2192},"ImageUrl=\"~\u002Fimages\u002Fx.png\"",{"type":51,"value":1647},{"type":45,"tag":72,"props":2195,"children":2197},{"className":2196},[],[2198],{"type":51,"value":2199},"ImageUrl=\"\u002Fimages\u002Fx.png\"",{"type":45,"tag":54,"props":2201,"children":2202},{},[2203],{"type":45,"tag":90,"props":2204,"children":2205},{},[2206],{"type":51,"value":2207},"Content\u002FLayout conversions:",{"type":45,"tag":223,"props":2209,"children":2210},{},[2211,2224,2240,2258],{"type":45,"tag":227,"props":2212,"children":2213},{},[2214,2216,2222],{"type":51,"value":2215},"Remove ",{"type":45,"tag":72,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":51,"value":2221},"\u003Casp:Content ContentPlaceHolderID=\"MainContent\">...\u003C\u002Fasp:Content>",{"type":51,"value":2223}," wrappers (keep inner content)",{"type":45,"tag":227,"props":2225,"children":2226},{},[2227,2233,2234],{"type":45,"tag":72,"props":2228,"children":2230},{"className":2229},[],[2231],{"type":51,"value":2232},"\u003Casp:Content ContentPlaceHolderID=\"HeadContent\">",{"type":51,"value":1647},{"type":45,"tag":72,"props":2235,"children":2237},{"className":2236},[],[2238],{"type":51,"value":2239},"\u003CHeadContent>",{"type":45,"tag":227,"props":2241,"children":2242},{},[2243,2249,2250,2256],{"type":45,"tag":72,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":51,"value":2248},"\u003Casp:ContentPlaceHolder ID=\"MainContent\" \u002F>",{"type":51,"value":1647},{"type":45,"tag":72,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":51,"value":2255},"@Body",{"type":51,"value":2257}," (in layouts)",{"type":45,"tag":227,"props":2259,"children":2260},{},[2261,2267,2268,2274],{"type":45,"tag":72,"props":2262,"children":2264},{"className":2263},[],[2265],{"type":51,"value":2266},"\u003Cform runat=\"server\">",{"type":51,"value":1647},{"type":45,"tag":72,"props":2269,"children":2271},{"className":2270},[],[2272],{"type":51,"value":2273},"\u003Cdiv>",{"type":51,"value":2275}," (preserves CSS block formatting context)",{"type":45,"tag":54,"props":2277,"children":2278},{},[2279,2281,2289],{"type":51,"value":2280},"Read ",{"type":45,"tag":90,"props":2282,"children":2283},{},[2284],{"type":45,"tag":1248,"props":2285,"children":2287},{"href":2286},"ref\u002Fmarkup-transforms.md",[2288],{"type":51,"value":2286},{"type":51,"value":2290}," for complete transformation tables and examples.",{"type":45,"tag":174,"props":2292,"children":2293},{},[],{"type":45,"tag":60,"props":2295,"children":2297},{"id":2296},"step-7-transform-code-behind-structural",[2298],{"type":51,"value":2299},"Step 7: Transform Code-Behind (Structural)",{"type":45,"tag":54,"props":2301,"children":2302},{},[2303,2305,2311,2313,2321],{"type":51,"value":2304},"For each ",{"type":45,"tag":72,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":51,"value":2310},".razor.cs",{"type":51,"value":2312}," file, apply these structural transformations. Read ",{"type":45,"tag":90,"props":2314,"children":2315},{},[2316],{"type":45,"tag":1248,"props":2317,"children":2319},{"href":2318},"ref\u002Fcode-transforms.md",[2320],{"type":51,"value":2318},{"type":51,"value":2322}," for detailed patterns:",{"type":45,"tag":54,"props":2324,"children":2325},{},[2326],{"type":45,"tag":90,"props":2327,"children":2328},{},[2329],{"type":51,"value":2330},"Lifecycle conversions:",{"type":45,"tag":223,"props":2332,"children":2333},{},[2334,2352,2370],{"type":45,"tag":227,"props":2335,"children":2336},{},[2337,2343,2344,2350],{"type":45,"tag":72,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":51,"value":2342},"Page_Load",{"type":51,"value":1647},{"type":45,"tag":72,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":51,"value":2349},"OnInitializedAsync",{"type":51,"value":2351}," (for first-load initialization)",{"type":45,"tag":227,"props":2353,"children":2354},{},[2355,2361,2362,2368],{"type":45,"tag":72,"props":2356,"children":2358},{"className":2357},[],[2359],{"type":51,"value":2360},"Page_PreRender",{"type":51,"value":1647},{"type":45,"tag":72,"props":2363,"children":2365},{"className":2364},[],[2366],{"type":51,"value":2367},"OnParametersSetAsync",{"type":51,"value":2369}," (for pre-render logic)",{"type":45,"tag":227,"props":2371,"children":2372},{},[2373,2374,2380,2382,2387],{"type":51,"value":2215},{"type":45,"tag":72,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":51,"value":2379},"if (!IsPostBack)",{"type":51,"value":2381}," guards — ",{"type":45,"tag":72,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":51,"value":2349},{"type":51,"value":2388}," runs once on first render (no postback concept)",{"type":45,"tag":974,"props":2390,"children":2391},{},[2392],{"type":45,"tag":54,"props":2393,"children":2394},{},[2395,2396,2401,2403,2408,2410,2415,2417,2422,2424,2429],{"type":51,"value":981},{"type":45,"tag":90,"props":2397,"children":2398},{},[2399],{"type":51,"value":2400},"Parameter-driven data loading:",{"type":51,"value":2402}," If the page loads data based on route parameters\nor query strings (e.g., category ID, product ID), use ",{"type":45,"tag":72,"props":2404,"children":2406},{"className":2405},[],[2407],{"type":51,"value":2367},{"type":51,"value":2409}," instead of\n",{"type":45,"tag":72,"props":2411,"children":2413},{"className":2412},[],[2414],{"type":51,"value":2349},{"type":51,"value":2416},". Unlike Web Forms postbacks, Blazor reuses component instances when\nonly the route parameter changes — ",{"type":45,"tag":72,"props":2418,"children":2420},{"className":2419},[],[2421],{"type":51,"value":2349},{"type":51,"value":2423}," won't re-run, but\n",{"type":45,"tag":72,"props":2425,"children":2427},{"className":2426},[],[2428],{"type":51,"value":2367},{"type":51,"value":2430}," will.",{"type":45,"tag":54,"props":2432,"children":2433},{},[2434],{"type":45,"tag":90,"props":2435,"children":2436},{},[2437],{"type":51,"value":2438},"Event handler signatures:",{"type":45,"tag":223,"props":2440,"children":2441},{},[2442,2454],{"type":45,"tag":227,"props":2443,"children":2444},{},[2445,2446,2452],{"type":51,"value":2215},{"type":45,"tag":72,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":51,"value":2451},"object sender, EventArgs e",{"type":51,"value":2453}," parameters",{"type":45,"tag":227,"props":2455,"children":2456},{},[2457,2459,2465,2466,2472,2474,2480],{"type":51,"value":2458},"Change ",{"type":45,"tag":72,"props":2460,"children":2462},{"className":2461},[],[2463],{"type":51,"value":2464},"protected void",{"type":51,"value":1647},{"type":45,"tag":72,"props":2467,"children":2469},{"className":2468},[],[2470],{"type":51,"value":2471},"private void",{"type":51,"value":2473}," (or ",{"type":45,"tag":72,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":51,"value":2479},"async Task",{"type":51,"value":2481},")",{"type":45,"tag":54,"props":2483,"children":2484},{},[2485],{"type":45,"tag":90,"props":2486,"children":2487},{},[2488],{"type":51,"value":2489},"Navigation:",{"type":45,"tag":223,"props":2491,"children":2492},{},[2493,2509],{"type":45,"tag":227,"props":2494,"children":2495},{},[2496,2502,2503],{"type":45,"tag":72,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":51,"value":2501},"Response.Redirect(\"~\u002Fpath\")",{"type":51,"value":1647},{"type":45,"tag":72,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":51,"value":2508},"NavigationManager.NavigateTo(\"\u002Fpath\")",{"type":45,"tag":227,"props":2510,"children":2511},{},[2512,2513,2519,2521,2526],{"type":51,"value":444},{"type":45,"tag":72,"props":2514,"children":2516},{"className":2515},[],[2517],{"type":51,"value":2518},"@inject NavigationManager NavigationManager",{"type":51,"value":2520}," to ",{"type":45,"tag":72,"props":2522,"children":2524},{"className":2523},[],[2525],{"type":51,"value":1623},{"type":51,"value":2527}," file",{"type":45,"tag":54,"props":2529,"children":2530},{},[2531],{"type":45,"tag":90,"props":2532,"children":2533},{},[2534],{"type":51,"value":2535},"Page title:",{"type":45,"tag":223,"props":2537,"children":2538},{},[2539],{"type":45,"tag":227,"props":2540,"children":2541},{},[2542,2548,2550,2556],{"type":45,"tag":72,"props":2543,"children":2545},{"className":2544},[],[2546],{"type":51,"value":2547},"Page.Title = \"...\"",{"type":51,"value":2549}," in code-behind → ",{"type":45,"tag":72,"props":2551,"children":2553},{"className":2552},[],[2554],{"type":51,"value":2555},"\u003CPageTitle>...\u003C\u002FPageTitle>",{"type":51,"value":2557}," in markup",{"type":45,"tag":54,"props":2559,"children":2560},{},[2561],{"type":45,"tag":90,"props":2562,"children":2563},{},[2564],{"type":51,"value":2565},"Data loading:",{"type":45,"tag":223,"props":2567,"children":2568},{},[2569,2581,2591],{"type":45,"tag":227,"props":2570,"children":2571},{},[2572,2574,2579],{"type":51,"value":2573},"Load data in ",{"type":45,"tag":72,"props":2575,"children":2577},{"className":2576},[],[2578],{"type":51,"value":2349},{"type":51,"value":2580}," using injected services",{"type":45,"tag":227,"props":2582,"children":2583},{},[2584,2586],{"type":51,"value":2585},"Bind data to component properties and render with ",{"type":45,"tag":72,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":51,"value":1735},{"type":45,"tag":227,"props":2592,"children":2593},{},[2594,2596,2602],{"type":51,"value":2595},"Inject required services (",{"type":45,"tag":72,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":51,"value":2601},"@inject ProductService ProductService",{"type":51,"value":2481},{"type":45,"tag":54,"props":2604,"children":2605},{},[2606],{"type":45,"tag":90,"props":2607,"children":2608},{},[2609],{"type":51,"value":2610},"State management:",{"type":45,"tag":223,"props":2612,"children":2613},{},[2614,2632],{"type":45,"tag":227,"props":2615,"children":2616},{},[2617,2623,2625,2631],{"type":45,"tag":72,"props":2618,"children":2620},{"className":2619},[],[2621],{"type":51,"value":2622},"ViewState[\"key\"]",{"type":51,"value":2624}," → component field (",{"type":45,"tag":72,"props":2626,"children":2628},{"className":2627},[],[2629],{"type":51,"value":2630},"private string _value;",{"type":51,"value":2481},{"type":45,"tag":227,"props":2633,"children":2634},{},[2635,2641],{"type":45,"tag":72,"props":2636,"children":2638},{"className":2637},[],[2639],{"type":51,"value":2640},"Session[\"key\"]",{"type":51,"value":2642}," → scoped DI service pattern",{"type":45,"tag":54,"props":2644,"children":2645},{},[2646,2647,2654],{"type":51,"value":2280},{"type":45,"tag":90,"props":2648,"children":2649},{},[2650],{"type":45,"tag":1248,"props":2651,"children":2652},{"href":2318},[2653],{"type":51,"value":2318},{"type":51,"value":2655}," for detailed patterns.",{"type":45,"tag":60,"props":2657,"children":2659},{"id":2658},"step-8-build-and-validate-migration-quality",[2660],{"type":51,"value":2661},"Step 8: Build and Validate Migration Quality",{"type":45,"tag":54,"props":2663,"children":2664},{},[2665],{"type":51,"value":2666},"Build the project and verify migration completeness:",{"type":45,"tag":189,"props":2668,"children":2670},{"className":317,"code":2669,"language":319,"meta":197,"style":197},"dotnet build\n",[2671],{"type":45,"tag":72,"props":2672,"children":2673},{"__ignoreMap":197},[2674],{"type":45,"tag":325,"props":2675,"children":2676},{"class":327,"line":30},[2677,2681],{"type":45,"tag":325,"props":2678,"children":2679},{"style":331},[2680],{"type":51,"value":334},{"type":45,"tag":325,"props":2682,"children":2683},{"style":337},[2684],{"type":51,"value":2685}," build\n",{"type":45,"tag":54,"props":2687,"children":2688},{},[2689],{"type":45,"tag":90,"props":2690,"children":2691},{},[2692],{"type":51,"value":2693},"After successful build, review migration completeness:",{"type":45,"tag":261,"props":2695,"children":2696},{},[2697,2781,2822],{"type":45,"tag":227,"props":2698,"children":2699},{},[2700,2705,2708,2710,2715,2717],{"type":45,"tag":90,"props":2701,"children":2702},{},[2703],{"type":51,"value":2704},"Check that controls were converted to Blazor:",{"type":45,"tag":791,"props":2706,"children":2707},{},[],{"type":51,"value":2709},"Search ",{"type":45,"tag":72,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":51,"value":1623},{"type":51,"value":2716}," files to verify Web Forms server controls were replaced:",{"type":45,"tag":223,"props":2718,"children":2719},{},[2720,2760],{"type":45,"tag":227,"props":2721,"children":2722},{},[2723,2725,2731,2732,2738,2739,2745,2746,2752,2753,2758],{"type":51,"value":2724},"✅ Files contain native HTML\u002Fcomponents like ",{"type":45,"tag":72,"props":2726,"children":2728},{"className":2727},[],[2729],{"type":51,"value":2730},"\u003Cinput",{"type":51,"value":452},{"type":45,"tag":72,"props":2733,"children":2735},{"className":2734},[],[2736],{"type":51,"value":2737},"\u003Cdiv",{"type":51,"value":452},{"type":45,"tag":72,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":51,"value":2744},"\u003Cbutton",{"type":51,"value":452},{"type":45,"tag":72,"props":2747,"children":2749},{"className":2748},[],[2750],{"type":51,"value":2751},"\u003Cselect",{"type":51,"value":452},{"type":45,"tag":72,"props":2754,"children":2756},{"className":2755},[],[2757],{"type":51,"value":1735},{"type":51,"value":2759}," loops",{"type":45,"tag":227,"props":2761,"children":2762},{},[2763,2765,2771,2773,2779],{"type":51,"value":2764},"⚠️ Any remaining ",{"type":45,"tag":72,"props":2766,"children":2768},{"className":2767},[],[2769],{"type":51,"value":2770},"\u003Casp:",{"type":51,"value":2772}," prefixes or ",{"type":45,"tag":72,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":51,"value":2778},"runat=\"server\"",{"type":51,"value":2780}," attributes indicate incomplete migration",{"type":45,"tag":227,"props":2782,"children":2783},{},[2784,2795],{"type":45,"tag":90,"props":2785,"children":2786},{},[2787,2789,2794],{"type":51,"value":2788},"Verify namespace imports in ",{"type":45,"tag":72,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":51,"value":458},{"type":51,"value":789},{"type":45,"tag":189,"props":2796,"children":2797},{"className":844,"code":1083,"language":846,"meta":197,"style":197},[2798],{"type":45,"tag":72,"props":2799,"children":2800},{"__ignoreMap":197},[2801,2808,2815],{"type":45,"tag":325,"props":2802,"children":2803},{"class":327,"line":30},[2804],{"type":45,"tag":325,"props":2805,"children":2806},{},[2807],{"type":51,"value":1095},{"type":45,"tag":325,"props":2809,"children":2810},{"class":327,"line":411},[2811],{"type":45,"tag":325,"props":2812,"children":2813},{},[2814],{"type":51,"value":1103},{"type":45,"tag":325,"props":2816,"children":2817},{"class":327,"line":420},[2818],{"type":45,"tag":325,"props":2819,"children":2820},{},[2821],{"type":51,"value":1111},{"type":45,"tag":227,"props":2823,"children":2824},{},[2825,2830,2833,2835],{"type":45,"tag":90,"props":2826,"children":2827},{},[2828],{"type":51,"value":2829},"Validate CSS\u002FJavaScript compatibility:",{"type":45,"tag":791,"props":2831,"children":2832},{},[],{"type":51,"value":2834},"If existing CSS or JavaScript depends on Web Forms HTML structure:",{"type":45,"tag":223,"props":2836,"children":2837},{},[2838,2843],{"type":45,"tag":227,"props":2839,"children":2840},{},[2841],{"type":51,"value":2842},"Run the application and test that styles and scripts still work correctly",{"type":45,"tag":227,"props":2844,"children":2845},{},[2846],{"type":51,"value":2847},"Blazor renders standard HTML — you may need to adjust CSS selectors or JavaScript event handlers to match the new HTML structure",{"type":45,"tag":54,"props":2849,"children":2850},{},[2851],{"type":51,"value":2852},"If migration issues remain after build validation, revisit the transformation references above and re-check lifecycle, data-binding, and control mapping patterns.",{"type":45,"tag":174,"props":2854,"children":2855},{},[],{"type":45,"tag":60,"props":2857,"children":2859},{"id":2858},"quick-reference",[2860],{"type":51,"value":2861},"Quick Reference",{"type":45,"tag":462,"props":2863,"children":2865},{"id":2864},"common-transformations",[2866],{"type":51,"value":2867},"Common Transformations",{"type":45,"tag":54,"props":2869,"children":2870},{},[2871,2876,2878,2883,2885,2890],{"type":45,"tag":90,"props":2872,"children":2873},{},[2874],{"type":51,"value":2875},"Controls:",{"type":51,"value":2877}," Remove ",{"type":45,"tag":72,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":51,"value":77},{"type":51,"value":2884}," prefix, ",{"type":45,"tag":72,"props":2886,"children":2888},{"className":2887},[],[2889],{"type":51,"value":2778},{"type":51,"value":2891},", and replace with native HTML",{"type":45,"tag":189,"props":2893,"children":2897},{"className":2894,"code":2895,"language":2896,"meta":197,"style":197},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- Before --> \u003Casp:Label ID=\"lblName\" runat=\"server\" Text=\"Hello\" \u002F>\n\u003C!-- After  --> \u003Clabel>Hello\u003C\u002Flabel>\n\n\u003C!-- Before --> \u003Casp:TextBox ID=\"Name\" runat=\"server\" \u002F>\n\u003C!-- After  --> \u003Cinput @bind=\"model.Name\" \u002F>\n\n\u003C!-- Before --> \u003Casp:Button Text=\"Submit\" OnClick=\"Submit_Click\" runat=\"server\" \u002F>\n\u003C!-- After  --> \u003Cbutton @onclick=\"Submit_Click\">Submit\u003C\u002Fbutton>\n","html",[2898],{"type":45,"tag":72,"props":2899,"children":2900},{"__ignoreMap":197},[2901,2995,3036,3045,3106,3148,3155,3238],{"type":45,"tag":325,"props":2902,"children":2903},{"class":327,"line":30},[2904,2909,2915,2921,2927,2932,2937,2942,2946,2951,2955,2959,2964,2968,2973,2977,2981,2986,2990],{"type":45,"tag":325,"props":2905,"children":2906},{"style":640},[2907],{"type":51,"value":2908},"\u003C!-- Before -->",{"type":45,"tag":325,"props":2910,"children":2912},{"style":2911},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2913],{"type":51,"value":2914}," \u003C",{"type":45,"tag":325,"props":2916,"children":2918},{"style":2917},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2919],{"type":51,"value":2920},"asp:Label",{"type":45,"tag":325,"props":2922,"children":2924},{"style":2923},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2925],{"type":51,"value":2926}," ID",{"type":45,"tag":325,"props":2928,"children":2929},{"style":2911},[2930],{"type":51,"value":2931},"=",{"type":45,"tag":325,"props":2933,"children":2934},{"style":2911},[2935],{"type":51,"value":2936},"\"",{"type":45,"tag":325,"props":2938,"children":2939},{"style":337},[2940],{"type":51,"value":2941},"lblName",{"type":45,"tag":325,"props":2943,"children":2944},{"style":2911},[2945],{"type":51,"value":2936},{"type":45,"tag":325,"props":2947,"children":2948},{"style":2923},[2949],{"type":51,"value":2950}," runat",{"type":45,"tag":325,"props":2952,"children":2953},{"style":2911},[2954],{"type":51,"value":2931},{"type":45,"tag":325,"props":2956,"children":2957},{"style":2911},[2958],{"type":51,"value":2936},{"type":45,"tag":325,"props":2960,"children":2961},{"style":337},[2962],{"type":51,"value":2963},"server",{"type":45,"tag":325,"props":2965,"children":2966},{"style":2911},[2967],{"type":51,"value":2936},{"type":45,"tag":325,"props":2969,"children":2970},{"style":2923},[2971],{"type":51,"value":2972}," Text",{"type":45,"tag":325,"props":2974,"children":2975},{"style":2911},[2976],{"type":51,"value":2931},{"type":45,"tag":325,"props":2978,"children":2979},{"style":2911},[2980],{"type":51,"value":2936},{"type":45,"tag":325,"props":2982,"children":2983},{"style":337},[2984],{"type":51,"value":2985},"Hello",{"type":45,"tag":325,"props":2987,"children":2988},{"style":2911},[2989],{"type":51,"value":2936},{"type":45,"tag":325,"props":2991,"children":2992},{"style":2911},[2993],{"type":51,"value":2994}," \u002F>\n",{"type":45,"tag":325,"props":2996,"children":2997},{"class":327,"line":411},[2998,3003,3007,3012,3017,3022,3027,3031],{"type":45,"tag":325,"props":2999,"children":3000},{"style":640},[3001],{"type":51,"value":3002},"\u003C!-- After  -->",{"type":45,"tag":325,"props":3004,"children":3005},{"style":2911},[3006],{"type":51,"value":2914},{"type":45,"tag":325,"props":3008,"children":3009},{"style":2917},[3010],{"type":51,"value":3011},"label",{"type":45,"tag":325,"props":3013,"children":3014},{"style":2911},[3015],{"type":51,"value":3016},">",{"type":45,"tag":325,"props":3018,"children":3020},{"style":3019},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[3021],{"type":51,"value":2985},{"type":45,"tag":325,"props":3023,"children":3024},{"style":2911},[3025],{"type":51,"value":3026},"\u003C\u002F",{"type":45,"tag":325,"props":3028,"children":3029},{"style":2917},[3030],{"type":51,"value":3011},{"type":45,"tag":325,"props":3032,"children":3033},{"style":2911},[3034],{"type":51,"value":3035},">\n",{"type":45,"tag":325,"props":3037,"children":3038},{"class":327,"line":420},[3039],{"type":45,"tag":325,"props":3040,"children":3042},{"emptyLinePlaceholder":3041},true,[3043],{"type":51,"value":3044},"\n",{"type":45,"tag":325,"props":3046,"children":3047},{"class":327,"line":877},[3048,3052,3056,3061,3065,3069,3073,3078,3082,3086,3090,3094,3098,3102],{"type":45,"tag":325,"props":3049,"children":3050},{"style":640},[3051],{"type":51,"value":2908},{"type":45,"tag":325,"props":3053,"children":3054},{"style":2911},[3055],{"type":51,"value":2914},{"type":45,"tag":325,"props":3057,"children":3058},{"style":2917},[3059],{"type":51,"value":3060},"asp:TextBox",{"type":45,"tag":325,"props":3062,"children":3063},{"style":2923},[3064],{"type":51,"value":2926},{"type":45,"tag":325,"props":3066,"children":3067},{"style":2911},[3068],{"type":51,"value":2931},{"type":45,"tag":325,"props":3070,"children":3071},{"style":2911},[3072],{"type":51,"value":2936},{"type":45,"tag":325,"props":3074,"children":3075},{"style":337},[3076],{"type":51,"value":3077},"Name",{"type":45,"tag":325,"props":3079,"children":3080},{"style":2911},[3081],{"type":51,"value":2936},{"type":45,"tag":325,"props":3083,"children":3084},{"style":2923},[3085],{"type":51,"value":2950},{"type":45,"tag":325,"props":3087,"children":3088},{"style":2911},[3089],{"type":51,"value":2931},{"type":45,"tag":325,"props":3091,"children":3092},{"style":2911},[3093],{"type":51,"value":2936},{"type":45,"tag":325,"props":3095,"children":3096},{"style":337},[3097],{"type":51,"value":2963},{"type":45,"tag":325,"props":3099,"children":3100},{"style":2911},[3101],{"type":51,"value":2936},{"type":45,"tag":325,"props":3103,"children":3104},{"style":2911},[3105],{"type":51,"value":2994},{"type":45,"tag":325,"props":3107,"children":3108},{"class":327,"line":886},[3109,3113,3117,3122,3127,3131,3135,3140,3144],{"type":45,"tag":325,"props":3110,"children":3111},{"style":640},[3112],{"type":51,"value":3002},{"type":45,"tag":325,"props":3114,"children":3115},{"style":2911},[3116],{"type":51,"value":2914},{"type":45,"tag":325,"props":3118,"children":3119},{"style":2917},[3120],{"type":51,"value":3121},"input",{"type":45,"tag":325,"props":3123,"children":3124},{"style":2923},[3125],{"type":51,"value":3126}," @bind",{"type":45,"tag":325,"props":3128,"children":3129},{"style":2911},[3130],{"type":51,"value":2931},{"type":45,"tag":325,"props":3132,"children":3133},{"style":2911},[3134],{"type":51,"value":2936},{"type":45,"tag":325,"props":3136,"children":3137},{"style":337},[3138],{"type":51,"value":3139},"model.Name",{"type":45,"tag":325,"props":3141,"children":3142},{"style":2911},[3143],{"type":51,"value":2936},{"type":45,"tag":325,"props":3145,"children":3146},{"style":2911},[3147],{"type":51,"value":2994},{"type":45,"tag":325,"props":3149,"children":3150},{"class":327,"line":895},[3151],{"type":45,"tag":325,"props":3152,"children":3153},{"emptyLinePlaceholder":3041},[3154],{"type":51,"value":3044},{"type":45,"tag":325,"props":3156,"children":3157},{"class":327,"line":26},[3158,3162,3166,3171,3175,3179,3183,3188,3192,3197,3201,3205,3210,3214,3218,3222,3226,3230,3234],{"type":45,"tag":325,"props":3159,"children":3160},{"style":640},[3161],{"type":51,"value":2908},{"type":45,"tag":325,"props":3163,"children":3164},{"style":2911},[3165],{"type":51,"value":2914},{"type":45,"tag":325,"props":3167,"children":3168},{"style":2917},[3169],{"type":51,"value":3170},"asp:Button",{"type":45,"tag":325,"props":3172,"children":3173},{"style":2923},[3174],{"type":51,"value":2972},{"type":45,"tag":325,"props":3176,"children":3177},{"style":2911},[3178],{"type":51,"value":2931},{"type":45,"tag":325,"props":3180,"children":3181},{"style":2911},[3182],{"type":51,"value":2936},{"type":45,"tag":325,"props":3184,"children":3185},{"style":337},[3186],{"type":51,"value":3187},"Submit",{"type":45,"tag":325,"props":3189,"children":3190},{"style":2911},[3191],{"type":51,"value":2936},{"type":45,"tag":325,"props":3193,"children":3194},{"style":2923},[3195],{"type":51,"value":3196}," OnClick",{"type":45,"tag":325,"props":3198,"children":3199},{"style":2911},[3200],{"type":51,"value":2931},{"type":45,"tag":325,"props":3202,"children":3203},{"style":2911},[3204],{"type":51,"value":2936},{"type":45,"tag":325,"props":3206,"children":3207},{"style":337},[3208],{"type":51,"value":3209},"Submit_Click",{"type":45,"tag":325,"props":3211,"children":3212},{"style":2911},[3213],{"type":51,"value":2936},{"type":45,"tag":325,"props":3215,"children":3216},{"style":2923},[3217],{"type":51,"value":2950},{"type":45,"tag":325,"props":3219,"children":3220},{"style":2911},[3221],{"type":51,"value":2931},{"type":45,"tag":325,"props":3223,"children":3224},{"style":2911},[3225],{"type":51,"value":2936},{"type":45,"tag":325,"props":3227,"children":3228},{"style":337},[3229],{"type":51,"value":2963},{"type":45,"tag":325,"props":3231,"children":3232},{"style":2911},[3233],{"type":51,"value":2936},{"type":45,"tag":325,"props":3235,"children":3236},{"style":2911},[3237],{"type":51,"value":2994},{"type":45,"tag":325,"props":3239,"children":3240},{"class":327,"line":912},[3241,3245,3249,3254,3259,3263,3267,3271,3275,3279,3283,3287,3291],{"type":45,"tag":325,"props":3242,"children":3243},{"style":640},[3244],{"type":51,"value":3002},{"type":45,"tag":325,"props":3246,"children":3247},{"style":2911},[3248],{"type":51,"value":2914},{"type":45,"tag":325,"props":3250,"children":3251},{"style":2917},[3252],{"type":51,"value":3253},"button",{"type":45,"tag":325,"props":3255,"children":3256},{"style":2923},[3257],{"type":51,"value":3258}," @onclick",{"type":45,"tag":325,"props":3260,"children":3261},{"style":2911},[3262],{"type":51,"value":2931},{"type":45,"tag":325,"props":3264,"children":3265},{"style":2911},[3266],{"type":51,"value":2936},{"type":45,"tag":325,"props":3268,"children":3269},{"style":337},[3270],{"type":51,"value":3209},{"type":45,"tag":325,"props":3272,"children":3273},{"style":2911},[3274],{"type":51,"value":2936},{"type":45,"tag":325,"props":3276,"children":3277},{"style":2911},[3278],{"type":51,"value":3016},{"type":45,"tag":325,"props":3280,"children":3281},{"style":3019},[3282],{"type":51,"value":3187},{"type":45,"tag":325,"props":3284,"children":3285},{"style":2911},[3286],{"type":51,"value":3026},{"type":45,"tag":325,"props":3288,"children":3289},{"style":2917},[3290],{"type":51,"value":3253},{"type":45,"tag":325,"props":3292,"children":3293},{"style":2911},[3294],{"type":51,"value":3035},{"type":45,"tag":54,"props":3296,"children":3297},{},[3298,3303],{"type":45,"tag":90,"props":3299,"children":3300},{},[3301],{"type":51,"value":3302},"Lifecycle:",{"type":51,"value":3304}," Convert Page_Load to OnInitializedAsync",{"type":45,"tag":189,"props":3306,"children":3310},{"className":3307,"code":3308,"language":3309,"meta":197,"style":197},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Before\nprotected void Page_Load(object sender, EventArgs e) { }\n\n\u002F\u002F After\nprotected override async Task OnInitializedAsync() { }\n","csharp",[3311],{"type":45,"tag":72,"props":3312,"children":3313},{"__ignoreMap":197},[3314,3322,3330,3337,3345],{"type":45,"tag":325,"props":3315,"children":3316},{"class":327,"line":30},[3317],{"type":45,"tag":325,"props":3318,"children":3319},{},[3320],{"type":51,"value":3321},"\u002F\u002F Before\n",{"type":45,"tag":325,"props":3323,"children":3324},{"class":327,"line":411},[3325],{"type":45,"tag":325,"props":3326,"children":3327},{},[3328],{"type":51,"value":3329},"protected void Page_Load(object sender, EventArgs e) { }\n",{"type":45,"tag":325,"props":3331,"children":3332},{"class":327,"line":420},[3333],{"type":45,"tag":325,"props":3334,"children":3335},{"emptyLinePlaceholder":3041},[3336],{"type":51,"value":3044},{"type":45,"tag":325,"props":3338,"children":3339},{"class":327,"line":877},[3340],{"type":45,"tag":325,"props":3341,"children":3342},{},[3343],{"type":51,"value":3344},"\u002F\u002F After\n",{"type":45,"tag":325,"props":3346,"children":3347},{"class":327,"line":886},[3348],{"type":45,"tag":325,"props":3349,"children":3350},{},[3351],{"type":51,"value":3352},"protected override async Task OnInitializedAsync() { }\n",{"type":45,"tag":174,"props":3354,"children":3355},{},[],{"type":45,"tag":60,"props":3357,"children":3359},{"id":3358},"reference-documents",[3360],{"type":51,"value":3361},"Reference Documents",{"type":45,"tag":54,"props":3363,"children":3364},{},[3365],{"type":51,"value":3366},"For detailed transformation patterns, control mappings, and troubleshooting:",{"type":45,"tag":223,"props":3368,"children":3369},{},[3370,3382,3394],{"type":45,"tag":227,"props":3371,"children":3372},{},[3373,3380],{"type":45,"tag":90,"props":3374,"children":3375},{},[3376],{"type":45,"tag":1248,"props":3377,"children":3378},{"href":2286},[3379],{"type":51,"value":2286},{"type":51,"value":3381}," — Directive conversion, expression syntax, URL transformations, form wrapper handling",{"type":45,"tag":227,"props":3383,"children":3384},{},[3385,3392],{"type":45,"tag":90,"props":3386,"children":3387},{},[3388],{"type":45,"tag":1248,"props":3389,"children":3390},{"href":2318},[3391],{"type":51,"value":2318},{"type":51,"value":3393}," — Lifecycle methods, event handlers, navigation, data binding SelectMethod patterns, query strings, Master Page to Layout migration",{"type":45,"tag":227,"props":3395,"children":3396},{},[3397,3404],{"type":45,"tag":90,"props":3398,"children":3399},{},[3400],{"type":45,"tag":1248,"props":3401,"children":3402},{"href":1886},[3403],{"type":51,"value":1886},{"type":51,"value":3405}," — Complete control translation tables mapping Web Forms controls to native HTML\u002FBlazor equivalents, Ajax Control Toolkit migration, structural components, theming infrastructure",{"type":45,"tag":174,"props":3407,"children":3408},{},[],{"type":45,"tag":60,"props":3410,"children":3412},{"id":3411},"success-criteria",[3413],{"type":51,"value":3414},"Success Criteria",{"type":45,"tag":54,"props":3416,"children":3417},{},[3418],{"type":45,"tag":90,"props":3419,"children":3420},{},[3421],{"type":51,"value":3422},"Migration scope:",{"type":45,"tag":223,"props":3424,"children":3427},{"className":3425},[3426],"contains-task-list",[3428,3439,3448],{"type":45,"tag":227,"props":3429,"children":3432},{"className":3430},[3431],"task-list-item",[3433,3437],{"type":45,"tag":3121,"props":3434,"children":3436},{"disabled":3041,"type":3435},"checkbox",[],{"type":51,"value":3438}," Migration approach determined (side-by-side or in-place)",{"type":45,"tag":227,"props":3440,"children":3442},{"className":3441},[3431],[3443,3446],{"type":45,"tag":3121,"props":3444,"children":3445},{"disabled":3041,"type":3435},[],{"type":51,"value":3447}," Target Blazor project created and configured",{"type":45,"tag":227,"props":3449,"children":3451},{"className":3450},[3431],[3452,3455],{"type":45,"tag":3121,"props":3453,"children":3454},{"disabled":3041,"type":3435},[],{"type":51,"value":3456}," All targeted Web Forms files identified",{"type":45,"tag":54,"props":3458,"children":3459},{},[3460],{"type":45,"tag":90,"props":3461,"children":3462},{},[3463],{"type":51,"value":3464},"File transformations:",{"type":45,"tag":223,"props":3466,"children":3468},{"className":3467},[3426],[3469,3485,3501,3516,3525],{"type":45,"tag":227,"props":3470,"children":3472},{"className":3471},[3431],[3473,3476,3478,3483],{"type":45,"tag":3121,"props":3474,"children":3475},{"disabled":3041,"type":3435},[],{"type":51,"value":3477}," All migrated files renamed with ",{"type":45,"tag":72,"props":3479,"children":3481},{"className":3480},[],[3482],{"type":51,"value":1623},{"type":51,"value":3484}," extension",{"type":45,"tag":227,"props":3486,"children":3488},{"className":3487},[3431],[3489,3492,3494,3499],{"type":45,"tag":3121,"props":3490,"children":3491},{"disabled":3041,"type":3435},[],{"type":51,"value":3493}," All ",{"type":45,"tag":72,"props":3495,"children":3497},{"className":3496},[],[3498],{"type":51,"value":77},{"type":51,"value":3500}," prefixes removed from controls",{"type":45,"tag":227,"props":3502,"children":3504},{"className":3503},[3431],[3505,3508,3509,3514],{"type":45,"tag":3121,"props":3506,"children":3507},{"disabled":3041,"type":3435},[],{"type":51,"value":3493},{"type":45,"tag":72,"props":3510,"children":3512},{"className":3511},[],[3513],{"type":51,"value":2778},{"type":51,"value":3515}," attributes removed",{"type":45,"tag":227,"props":3517,"children":3519},{"className":3518},[3431],[3520,3523],{"type":45,"tag":3121,"props":3521,"children":3522},{"disabled":3041,"type":3435},[],{"type":51,"value":3524}," Web Forms expressions converted to Razor syntax",{"type":45,"tag":227,"props":3526,"children":3528},{"className":3527},[3431],[3529,3532,3533,3539,3541],{"type":45,"tag":3121,"props":3530,"children":3531},{"disabled":3041,"type":3435},[],{"type":51,"value":826},{"type":45,"tag":72,"props":3534,"children":3536},{"className":3535},[],[3537],{"type":51,"value":3538},"~\u002F",{"type":51,"value":3540}," URLs replaced with ",{"type":45,"tag":72,"props":3542,"children":3544},{"className":3543},[],[3545],{"type":51,"value":3546},"\u002F",{"type":45,"tag":54,"props":3548,"children":3549},{},[3550],{"type":45,"tag":90,"props":3551,"children":3552},{},[3553],{"type":51,"value":3554},"Data binding:",{"type":45,"tag":223,"props":3556,"children":3558},{"className":3557},[3426],[3559,3590,3612],{"type":45,"tag":227,"props":3560,"children":3562},{"className":3561},[3431],[3563,3566,3568,3574,3575,3581,3582,3588],{"type":45,"tag":3121,"props":3564,"children":3565},{"disabled":3041,"type":3435},[],{"type":51,"value":3567}," DataSource controls (",{"type":45,"tag":72,"props":3569,"children":3571},{"className":3570},[],[3572],{"type":51,"value":3573},"SqlDataSource",{"type":51,"value":452},{"type":45,"tag":72,"props":3576,"children":3578},{"className":3577},[],[3579],{"type":51,"value":3580},"ObjectDataSource",{"type":51,"value":452},{"type":45,"tag":72,"props":3583,"children":3585},{"className":3584},[],[3586],{"type":51,"value":3587},"EntityDataSource",{"type":51,"value":3589},") replaced with injected services",{"type":45,"tag":227,"props":3591,"children":3593},{"className":3592},[3431],[3594,3597,3599,3604,3605,3610],{"type":45,"tag":3121,"props":3595,"children":3596},{"disabled":3041,"type":3435},[],{"type":51,"value":3598}," Data loaded in component lifecycle methods (",{"type":45,"tag":72,"props":3600,"children":3602},{"className":3601},[],[3603],{"type":51,"value":2349},{"type":51,"value":1756},{"type":45,"tag":72,"props":3606,"children":3608},{"className":3607},[],[3609],{"type":51,"value":2367},{"type":51,"value":3611},") as appropriate",{"type":45,"tag":227,"props":3613,"children":3615},{"className":3614},[3431],[3616,3619,3621,3626,3628,3633],{"type":45,"tag":3121,"props":3617,"children":3618},{"disabled":3041,"type":3435},[],{"type":51,"value":3620}," Lists\u002Ftables rendered using Blazor markup (",{"type":45,"tag":72,"props":3622,"children":3624},{"className":3623},[],[3625],{"type":51,"value":1735},{"type":51,"value":3627},", components such as ",{"type":45,"tag":72,"props":3629,"children":3631},{"className":3630},[],[3632],{"type":51,"value":1743},{"type":51,"value":3634}," when needed)",{"type":45,"tag":54,"props":3636,"children":3637},{},[3638],{"type":45,"tag":90,"props":3639,"children":3640},{},[3641],{"type":51,"value":3642},"Code-behind:",{"type":45,"tag":223,"props":3644,"children":3646},{"className":3645},[3426],[3647,3666,3687],{"type":45,"tag":227,"props":3648,"children":3650},{"className":3649},[3431],[3651,3654,3655,3660,3661],{"type":45,"tag":3121,"props":3652,"children":3653},{"disabled":3041,"type":3435},[],{"type":51,"value":826},{"type":45,"tag":72,"props":3656,"children":3658},{"className":3657},[],[3659],{"type":51,"value":2342},{"type":51,"value":1647},{"type":45,"tag":72,"props":3662,"children":3664},{"className":3663},[],[3665],{"type":51,"value":2349},{"type":45,"tag":227,"props":3667,"children":3669},{"className":3668},[3431],[3670,3673,3674,3680,3681],{"type":45,"tag":3121,"props":3671,"children":3672},{"disabled":3041,"type":3435},[],{"type":51,"value":826},{"type":45,"tag":72,"props":3675,"children":3677},{"className":3676},[],[3678],{"type":51,"value":3679},"Response.Redirect",{"type":51,"value":1647},{"type":45,"tag":72,"props":3682,"children":3684},{"className":3683},[],[3685],{"type":51,"value":3686},"NavigationManager.NavigateTo",{"type":45,"tag":227,"props":3688,"children":3690},{"className":3689},[3431],[3691,3694],{"type":45,"tag":3121,"props":3692,"children":3693},{"disabled":3041,"type":3435},[],{"type":51,"value":3695}," Master pages converted to Blazor layouts",{"type":45,"tag":54,"props":3697,"children":3698},{},[3699],{"type":45,"tag":90,"props":3700,"children":3701},{},[3702],{"type":51,"value":3703},"Validation:",{"type":45,"tag":223,"props":3705,"children":3707},{"className":3706},[3426],[3708,3717,3726,3735],{"type":45,"tag":227,"props":3709,"children":3711},{"className":3710},[3431],[3712,3715],{"type":45,"tag":3121,"props":3713,"children":3714},{"disabled":3041,"type":3435},[],{"type":51,"value":3716}," Target project builds without errors",{"type":45,"tag":227,"props":3718,"children":3720},{"className":3719},[3431],[3721,3724],{"type":45,"tag":3121,"props":3722,"children":3723},{"disabled":3041,"type":3435},[],{"type":51,"value":3725}," Application runs and renders migrated pages correctly",{"type":45,"tag":227,"props":3727,"children":3729},{"className":3728},[3431],[3730,3733],{"type":45,"tag":3121,"props":3731,"children":3732},{"disabled":3041,"type":3435},[],{"type":51,"value":3734}," Interactive features (buttons, forms, navigation) function as expected",{"type":45,"tag":227,"props":3736,"children":3738},{"className":3737},[3431],[3739,3742],{"type":45,"tag":3121,"props":3740,"children":3741},{"disabled":3041,"type":3435},[],{"type":51,"value":3743}," For side-by-side: original WebForms project still builds and runs (if preservation is required)",{"type":45,"tag":3745,"props":3746,"children":3747},"style",{},[3748],{"type":51,"value":3749},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3751,"total":3847},[3752,3764,3778,3795,3805,3818,3835],{"slug":3753,"name":3753,"fn":3754,"description":3755,"org":3756,"tags":3757,"stars":26,"repoUrl":27,"updatedAt":3763},"converting-to-cpm","migrate .NET projects to Central Package Management","Converts .NET projects and solutions to NuGet Central Package Management (CPM) with Directory.Packages.props. Use when the user wants to centralize, convert, align, or sync NuGet package versions across multiple projects, resolve version conflicts or mismatches, or get versions consistent across a solution or repository. Also triggers when packages are out of sync or drifting across projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3758,3761,3762],{"name":3759,"slug":3760,"type":15},".NET","net",{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},"2026-07-18T05:14:13.971821",{"slug":3765,"name":3765,"fn":3766,"description":3767,"org":3768,"tags":3769,"stars":26,"repoUrl":27,"updatedAt":3777},"creating-winforms-custom-controls","create custom WinForms controls","Creates custom controls and UserControls for modern WinForms (.NET 6+). Use when deriving from Control, UserControl, Button, TextBox, or other base controls, implementing custom rendering with OnPaint overrides, creating composite controls with child control composition, adding custom properties with [Browsable], [Category], or [DefaultValue] attributes for Designer support, implementing INotifyPropertyChanged for control properties, handling Layout\u002FLayoutEngine for custom sizing, creating scrollable controls with AutoScrollMinSize, implementing dark mode theming, or building List\u002FGrid\u002FTree-like controls. Also triggers for \"custom UserControl\", \"derive from Control\", \"owner-drawn control\", \"Designer properties\", \"[Browsable] attribute\", \"custom WinForms control\", \"LayoutEngine\", \"AutoScroll control\", and \"themed control\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3770,3771,3774],{"name":3759,"slug":3760,"type":15},{"name":3772,"slug":3773,"type":15},"Windows","windows",{"name":3775,"slug":3776,"type":15},"WinUI","winui","2026-07-03T16:31:30.1325",{"slug":3779,"name":3779,"fn":3780,"description":3781,"org":3782,"tags":3783,"stars":26,"repoUrl":27,"updatedAt":3794},"managing-winforms-high-dpi-layout","design high-DPI responsive WinForms layouts","Implements WinForms high-DPI fluent layouts using TableLayoutPanel, FlowLayoutPanel, and DPI-aware design patterns. Use when creating responsive form layouts that must scale across different DPI settings, implementing Per Monitor V2 (PerMonitorV2) DPI awareness, working with TableLayoutPanel.RowStyles\u002FColumnStyles, using FlowLayoutPanel for dynamic layouts, replacing fixed pixel positioning with container-based layout, troubleshooting DPI scaling issues, or structuring nested layout containers. Also triggers for \"TableLayoutPanel\", \"FlowLayoutPanel\", \"high DPI WinForms\", \"PerMonitorV2\", \"DPI aware layout\", \"responsive WinForms\", \"scale UI\", \"AutoScaleMode\", and \"DPI scaling\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3784,3787,3790,3793],{"name":3785,"slug":3786,"type":15},"Design","design",{"name":3788,"slug":3789,"type":15},"Desktop","desktop",{"name":3791,"slug":3792,"type":15},"UI Components","ui-components",{"name":3772,"slug":3773,"type":15},"2026-07-18T05:14:12.982806",{"slug":3796,"name":3796,"fn":3797,"description":3798,"org":3799,"tags":3800,"stars":26,"repoUrl":27,"updatedAt":3804},"managing-winforms-mvvm","implement MVVM pattern in WinForms","Implements MVVM pattern in WinForms applications (.NET 8+) with ViewModels, Commands, and DataContext. Use when user explicitly requests MVVM implementation, setting up ViewModel with INotifyPropertyChanged or ObservableObject, implementing ICommand or RelayCommand, wiring Form.DataContext, binding controls to ViewModel properties, creating Commands for button clicks, or separating business logic from UI code. Also triggers for \"WinForms MVVM\", \"ViewModel in WinForms\", \"INotifyPropertyChanged\", \"DataContext binding\", \"Command pattern WinForms\", \"ObservableObject\", \"RelayCommand\", and \"testable WinForms\". Also use when fixing existing MVVM code or when guided by winforms-feature-adoption scenario. DO NOT USE FOR: automatic application during version upgrades (opt-in only).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3801,3802,3803],{"name":3759,"slug":3760,"type":15},{"name":3772,"slug":3773,"type":15},{"name":3775,"slug":3776,"type":15},"2026-07-18T05:14:11.951511",{"slug":3806,"name":3806,"fn":3807,"description":3808,"org":3809,"tags":3810,"stars":26,"repoUrl":27,"updatedAt":3817},"migrating-aspnet-framework-to-core","migrate ASP.NET Framework to Core","Orchestrates migration of ASP.NET Framework (System.Web) MVC and WebAPI projects to ASP.NET Core. Covers only old .NET Framework web projects — not applicable to ASP.NET Core or modern .NET web projects (those are already on the target stack). Defines the ordered phase sequence (project file, host, config, DI, controllers, middleware, auth, views, cleanup), satellite skill dispatch, and migration unit breakdown for both in-place and side-by-side modes. Use when executing a task that upgrades a project with System.Web dependencies, HttpModules, HttpHandlers, MVC controllers, WebAPI controllers, or Global.asax. Also triggers for \"migrate ASP.NET to Core\", \"upgrade MVC project\", \"convert WebAPI to ASP.NET Core\". Not applicable to class libraries unless they directly reference System.Web.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3811,3812,3813,3816],{"name":3759,"slug":3760,"type":15},{"name":17,"slug":18,"type":15},{"name":3814,"slug":3815,"type":15},"Backend","backend",{"name":24,"slug":25,"type":15},"2026-07-03T16:30:55.581898",{"slug":3819,"name":3819,"fn":3820,"description":3821,"org":3822,"tags":3823,"stars":26,"repoUrl":27,"updatedAt":3834},"migrating-documentdb-to-cosmos","migrate DocumentDB to Cosmos DB","Migrates from the deprecated Microsoft.Azure.DocumentDB SDK (V2) to the modern Microsoft.Azure.Cosmos SDK (V3) for Azure Cosmos DB. Use ONLY when Microsoft.Azure.DocumentDB has been flagged as deprecated or obsolete and must be replaced — not for version-bump scenarios where the V2 SDK is still supported.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3824,3827,3830,3833],{"name":3825,"slug":3826,"type":15},"Azure","azure",{"name":3828,"slug":3829,"type":15},"Cosmos DB","cosmos-db",{"name":3831,"slug":3832,"type":15},"Database","database",{"name":24,"slug":25,"type":15},"2026-07-03T16:31:21.932144",{"slug":3836,"name":3836,"fn":3837,"description":3838,"org":3839,"tags":3840,"stars":26,"repoUrl":27,"updatedAt":3846},"migrating-global-asax","migrate Global.asax to ASP.NET Core middleware","Migrates Global.asax application lifecycle events to ASP.NET Core middleware, startup configuration, and Program.cs. Use when upgrading ASP.NET Framework apps containing Global.asax or Global.asax.cs files. Triggers for \"migrate Global.asax\", \"convert application events\", \"move Application_Start to Program.cs\", \"replace Global.asax with middleware\", and ASP.NET-to-Core migration involving request lifecycle, error handling, or session management.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3841,3843,3844,3845],{"name":17,"slug":3842,"type":15},"aspnet-core",{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},{"name":13,"slug":14,"type":15},"2026-07-07T06:54:34.226435",19,{"items":3849,"total":4036},[3850,3872,3889,3910,3925,3942,3953,3966,3981,3996,4011,4024],{"slug":3851,"name":3851,"fn":3852,"description":3853,"org":3854,"tags":3855,"stars":3869,"repoUrl":3870,"updatedAt":3871},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3856,3859,3862,3863,3866],{"name":3857,"slug":3858,"type":15},"Engineering","engineering",{"name":3860,"slug":3861,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":3864,"slug":3865,"type":15},"Project Management","project-management",{"name":3867,"slug":3868,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":3873,"name":3873,"fn":3874,"description":3875,"org":3876,"tags":3877,"stars":3886,"repoUrl":3887,"updatedAt":3888},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3878,3879,3882,3883],{"name":3759,"slug":3760,"type":15},{"name":3880,"slug":3881,"type":15},"Agents","agents",{"name":3825,"slug":3826,"type":15},{"name":3884,"slug":3885,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":3890,"name":3890,"fn":3891,"description":3892,"org":3893,"tags":3894,"stars":3886,"repoUrl":3887,"updatedAt":3909},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3895,3898,3899,3902,3905,3906],{"name":3896,"slug":3897,"type":15},"Analytics","analytics",{"name":3825,"slug":3826,"type":15},{"name":3900,"slug":3901,"type":15},"Data Analysis","data-analysis",{"name":3903,"slug":3904,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":3907,"slug":3908,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":3911,"name":3911,"fn":3912,"description":3913,"org":3914,"tags":3915,"stars":3886,"repoUrl":3887,"updatedAt":3924},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3916,3919,3920,3921],{"name":3917,"slug":3918,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3825,"slug":3826,"type":15},{"name":3903,"slug":3904,"type":15},{"name":3922,"slug":3923,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":3926,"name":3926,"fn":3927,"description":3928,"org":3929,"tags":3930,"stars":3886,"repoUrl":3887,"updatedAt":3941},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3931,3932,3935,3936,3937,3940],{"name":3825,"slug":3826,"type":15},{"name":3933,"slug":3934,"type":15},"Compliance","compliance",{"name":3884,"slug":3885,"type":15},{"name":9,"slug":8,"type":15},{"name":3938,"slug":3939,"type":15},"Python","python",{"name":3922,"slug":3923,"type":15},"2026-07-18T05:14:23.017504",{"slug":3943,"name":3943,"fn":3944,"description":3945,"org":3946,"tags":3947,"stars":3886,"repoUrl":3887,"updatedAt":3952},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3948,3949,3950,3951],{"name":3896,"slug":3897,"type":15},{"name":3825,"slug":3826,"type":15},{"name":3884,"slug":3885,"type":15},{"name":3938,"slug":3939,"type":15},"2026-07-31T05:54:29.068751",{"slug":3954,"name":3954,"fn":3955,"description":3956,"org":3957,"tags":3958,"stars":3886,"repoUrl":3887,"updatedAt":3965},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3959,3962,3963,3964],{"name":3960,"slug":3961,"type":15},"API Development","api-development",{"name":3825,"slug":3826,"type":15},{"name":9,"slug":8,"type":15},{"name":3938,"slug":3939,"type":15},"2026-07-18T05:14:16.988376",{"slug":3967,"name":3967,"fn":3968,"description":3969,"org":3970,"tags":3971,"stars":3886,"repoUrl":3887,"updatedAt":3980},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3972,3973,3976,3979],{"name":3825,"slug":3826,"type":15},{"name":3974,"slug":3975,"type":15},"Computer Vision","computer-vision",{"name":3977,"slug":3978,"type":15},"Images","images",{"name":3938,"slug":3939,"type":15},"2026-07-18T05:14:18.007737",{"slug":3982,"name":3982,"fn":3983,"description":3984,"org":3985,"tags":3986,"stars":3886,"repoUrl":3887,"updatedAt":3995},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3987,3988,3991,3994],{"name":3825,"slug":3826,"type":15},{"name":3989,"slug":3990,"type":15},"Configuration","configuration",{"name":3992,"slug":3993,"type":15},"Feature Flags","feature-flags",{"name":3903,"slug":3904,"type":15},"2026-07-03T16:32:01.278468",{"slug":3997,"name":3997,"fn":3998,"description":3999,"org":4000,"tags":4001,"stars":3886,"repoUrl":3887,"updatedAt":4010},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4002,4003,4004,4007],{"name":3828,"slug":3829,"type":15},{"name":3831,"slug":3832,"type":15},{"name":4005,"slug":4006,"type":15},"NoSQL","nosql",{"name":4008,"slug":4009,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":4012,"name":4012,"fn":3998,"description":4013,"org":4014,"tags":4015,"stars":3886,"repoUrl":3887,"updatedAt":4023},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4016,4017,4018,4019,4020],{"name":3828,"slug":3829,"type":15},{"name":3831,"slug":3832,"type":15},{"name":9,"slug":8,"type":15},{"name":4005,"slug":4006,"type":15},{"name":4021,"slug":4022,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":4025,"name":4025,"fn":4026,"description":4027,"org":4028,"tags":4029,"stars":3886,"repoUrl":3887,"updatedAt":4035},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4030,4031,4032,4033,4034],{"name":3825,"slug":3826,"type":15},{"name":3828,"slug":3829,"type":15},{"name":3831,"slug":3832,"type":15},{"name":3903,"slug":3904,"type":15},{"name":4005,"slug":4006,"type":15},"2026-05-13T06:14:17.582229",267]