About neo-dotnet-tag-helper
neo-dotnet-tag-helper is a skill for designing and generating custom Razor Tag Helpers in C#. It gathers requirements for tags and attributes, then guides implementation and validation without generating `.cshtml` files.
Key features
- 01Clarifies tag and attribute requirements
- 02Generates C# Tag Helper classes
- 03Uses TagBuilder for HTML construction
- 04Guidance for dependency injection and context
- 05Checks typing and thread safety
Use cases
- 01Building reusable custom HTML tags
- 02Encapsulating UI logic in C#
- 03Generating a Tag Helper with service dependencies
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ benknightdark/ neo-skills --skill neo-dotnet-tag-helperAfter installing, type/neo-dotnet-tag-helperin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
reference/anti-patterns.mdcoding-style.mdpatterns.mdDetails
From the project README.NET Tag Helper Expert Skill
Trigger On
- The user requests to create, generate, or design a custom Razor Tag Helper in C#.
- The user wants to encapsulate complex HTML/UI logic into reusable custom tags without using Partial Views or CSHTML.
- The target framework is .NET 6.0 (LTS) and above.
Workflow (Generator Pattern)
Follow these steps exactly to create robust, high-performance C# Tag Helpers.
Step 1: Perceive & Gather Requirements (Inversion)
Before writing any code, ask the user to clarify the following if not already provided:
- Target HTML Tag: What is the name of the custom tag in HTML? (e.g.,
<my-button>,<user-card>) - Properties: What parameters/attributes should this tag accept? (e.g.,
theme,is-active,user-id) - Dependencies (DI): Does this tag need to query a database or call a service? (Needs Dependency Injection)
- Context: Does it need to access
ViewContext(e.g., to generate URLs or check model state)?
Step 2: Reason & Design (Planning)
Based on the answers:
- Class Naming: Ensure the class name ends with
TagHelper(e.g.,MyButtonTagHelper). - Target Element: Apply
[HtmlTargetElement("my-button")]. - Properties: Map HTML kebab-case attributes to C# PascalCase properties. Apply
[HtmlAttributeName("is-active")]if necessary. - Method Selection:
- If no IO/Async operations, override
Process. - If using DI for database/API calls, override
ProcessAsync.
- If no IO/Async operations, override
Step 3: Act (Code Generation)
Generate the complete C# class. Strictly adhere to the following rules:
- Inherit from
Microsoft.AspNetCore.Razor.TagHelpers.TagHelper. - Do NOT generate
.cshtmlfiles. All HTML must be constructed usingTagBuilderinside the C# class. - If
ViewContextis needed, use[ViewContext]and[HtmlAttributeNotBound]. - Manage content properly using
output.TagName,output.Attributes.SetAttribute, andoutput.Content.SetHtmlContent. - Ensure Thread-Safety (do not store request-specific state in instance fields unless injected as scoped/transient).
Step 4: Validate (Quality Check)
Review the generated code against these criteria before presenting it:
- Are all properties strongly typed?
- Is
TagBuilderused instead of string concatenation for HTML elements? - Is
ProcessAsyncused correctly if awaiting tasks?
Deliverable
Present the C# code wrapped in a markdown code block. Briefly explain how to register it in _ViewImports.cshtml (e.g., @addTagHelper *, YourAssemblyName).