← ClaudeAtlas

classic-asp-to-aspnet-mvclisted

Conventions and a working playbook for porting Classic ASP or Web Forms sites to ASP.NET Core MVC on net10.0: Program.cs composition, controllers and routing, view models, Razor layouts, sections and partial views, wwwroot assets, configuration through validated options instead of raw configuration keys, secrets in user secrets locally and Azure Key Vault in production, Dapper repositories behind Abstractions interfaces, and typed HttpClient services that return models rather than transport objects. Use this skill whenever migrating a Classic ASP, ASP, or Web Forms application to ASP.NET Core MVC, reviewing such a migration, scaffolding the MVC layout for a ported site, or deciding where ported inline logic belongs in the new structure.
GuerthCastro/claude-skills-dotnet · ★ 1 · AI & Automation · score 72
Install: claude install-skill GuerthCastro/claude-skills-dotnet
# Classic ASP to ASP.NET Core MVC The target is a server side rendered MVC app on `net10.0`. Most of the page is computed on the server and returned as finished HTML, which is the closest analogue to how the ASP pages already work. That similarity is what makes the port tractable, and it is also the trap: an `.asp` file translated line by line into a `.cshtml` file compiles and runs while keeping every structural problem it had. Three components: - **Models** act like types. Fields and their datatypes, passed around as a unit. - **Views** are `.cshtml` files. Mostly HTML, with C# available where it earns its place. - **Controllers** hold the logic. Methods take parameters and return status codes, JSON, or Views. ## Non-negotiable rules - Every value read from configuration goes through a bound options class. No `Configuration["Some:Key"]` anywhere, including bootstrap code that runs before the container exists: that reads a section, and the section name is a constant on the options type it describes. - Every string that is an external contract is a named constant: third party form fields, HTTP header names, query string keys. The literal appears once, next to the type that owns it. - One statement per line. A call that fits on one line stays on one line, however long. Object and collection initializers and constructor declarations are exempt and keep their braces open. - Do not port anything whose purpose you cannot state in one sentence. If it survives the port