| name | component-development |
|---|---|
| description | Guidance for creating Blazor components that emulate ASP.NET Web Forms controls. Use this when implementing new components or extending existing ones in the BlazorWebFormsComponents library. |
This skill covers creating new Blazor components that emulate ASP.NET Web Forms controls.
- HTML Output Matching Guide - How to ensure Blazor components render identical HTML to Web Forms controls
- Identify the Web Forms control from
System.Web.UI.WebControls - Research the HTML output using the HTML Output Matching Guide
- Create component files:
src/BlazorWebFormsComponents/{ComponentName}.razorsrc/BlazorWebFormsComponents/{ComponentName}.razor.cs
- Inherit from appropriate base class:
BaseWebFormsComponent- Basic componentsBaseStyledComponent- Components with stylingDataBoundComponent<T>- Data-bound components
- Add unit tests in
src/BlazorWebFormsComponents.Test/{ComponentName}/ - Add sample page in
samples/AfterBlazorServerSide/Components/Pages/ControlSamples/{ComponentName}/ - Add integration tests using Playwright in
samples/AfterBlazorServerSide.Tests/ - Create documentation in
docs/{Category}/{ComponentName}.md - Update navigation:
- Add to
samples/AfterBlazorServerSide/Components/Layout/NavMenu.razor(TreeView) - Add to
samples/AfterBlazorServerSide/Components/Pages/ComponentList.razor(home page catalog) - Update
mkdocs.ymlandREADME.md
- Add to
| Base Class | Use When |
|---|---|
BaseWebFormsComponent |
Simple components without styling (Literal, PlaceHolder) |
BaseStyledComponent |
Components with visual styling (Label, Panel, Button) |
ButtonBaseComponent |
Button-like components (Button, LinkButton, ImageButton) |
DataBoundComponent<T> |
Components binding to collections (Repeater, GridView) |
BaseValidator |
Validation controls |
Match Web Forms property names exactly:
TextnotLabelorContentCssClassnotClassorClassNameNavigateUrlnotHreforUrlImageUrlnotSrcorSource
Prefix with On:
OnClickfor click eventsOnCommandfor command eventsOnSelectedIndexChangedfor selection changesOnDataBindingfor data binding events
Every component must have integration tests in samples/AfterBlazorServerSide.Tests/ using Playwright:
-
Page load test in
ControlSampleTests.cs:- Add route to the appropriate
[Theory]test (EditorControl, DataControl, etc.) - Verifies page loads without console errors or page errors
- Add route to the appropriate
-
Interactive test in
InteractiveComponentTests.cs(for interactive components):- Test user interactions (clicks, input, selection changes)
- Verify component responds correctly to user actions
- Assert no console errors during interaction
Example page load test entry:
[Theory]
[InlineData("/ControlSamples/YourComponent")]
public async Task EditorControl_Loads_WithoutErrors(string path)Example interactive test:
[Fact]
public async Task YourComponent_Interaction_Works()
{
var page = await _fixture.NewPageAsync();
try
{
await page.GotoAsync($"{_fixture.BaseUrl}/ControlSamples/YourComponent");
// Test interactions...
// Assert expected behavior...
}
finally
{
await page.CloseAsync();
}
}Run integration tests with:
dotnet test samples/AfterBlazorServerSide.Tests