From ABP Sensei
Develops ABP Framework v10.4 UI: MVC/Razor Pages, Blazor, Angular, React, LeptonX theming, menu contributors, dynamic proxies. Use for building frontend pages and components in ABP.
How this skill is triggered — by the user, by Claude, or both
Slash command
/abp-sensei:abp-uiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
ABP Framework v10.4 UI framework integrations. MVC/Razor Pages, Blazor, Angular, React, and UI theming.
ABP Framework v10.4 UI framework integrations. MVC/Razor Pages, Blazor, Angular, React, and UI theming.
| Framework | Type | Note |
|---|---|---|
| MVC/Razor Pages | Server-side | Default, most mature |
| Blazor Web App | Server-side (.NET 10) | Modern Blazor |
| Blazor WASM | Client-side | SPA style |
| Blazor Server | Server-side | With SignalR |
| Angular | Client-side | TypeScript SPA |
| React | Client-side | With the modern template |
| MAUI Blazor | Cross-platform mobile | Team+ license |
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
public class MyWebModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddRazorPages();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseConfiguredEndpoints(endpoints => endpoints.MapRazorPages());
}
}
[Area("App")]
[Route("api/app/book")]
public class BookController : AbpController
{
private readonly IBookAppService _bookAppService;
public BookController(IBookAppService bookAppService)
{
_bookAppService = bookAppService;
}
[HttpGet]
public Task<PagedResultDto<BookDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
return _bookAppService.GetListAsync(input);
}
}
public class IndexModel : AbpPageModel
{
private readonly IBookAppService _bookAppService;
public List<BookDto> Books { get; set; }
public IndexModel(IBookAppService bookAppService)
{
_bookAppService = bookAppService;
}
public async Task OnGetAsync()
{
var result = await _bookAppService.GetListAsync(new PagedAndSortedResultRequestDto());
Books = result.Items;
}
}
[DependsOn(
typeof(AbpAspNetCoreComponentsWebAssemblyModule),
typeof(AbpAutoMapperModule)
)]
public class MyBlazorModule : AbpModule { }
@page "/books"
@inject IBookAppService BookAppService
<h3>Books</h3>
@if (books == null)
{
<p>Loading...</p>
}
else
{
<table class="table">
<thead>
<tr><th>Name</th><th>Type</th><th>Price</th></tr>
</thead>
<tbody>
@foreach (var book in books.Items)
{
<tr>
<td>@book.Name</td>
<td>@book.Type</td>
<td>@book.Price</td>
</tr>
}
</tbody>
</table>
}
@code {
private PagedResultDto<BookDto> books;
protected override async Task OnInitializedAsync()
{
books = await BookAppService.GetListAsync(new PagedAndSortedResultRequestDto());
}
}
// The dynamic C# HTTP proxy is generated automatically
// Defined in the HttpApi.Client project
abp generate-proxy -t ng
The automatically generated services are created in the src/app/proxy/ directory.
import { BookService } from '@proxy/books';
@Component({...})
export class BookListComponent {
books: BookDto[] = [];
constructor(private bookService: BookService) {}
ngOnInit(): void {
this.bookService.getList({}).subscribe(result => {
this.books = result.items;
});
}
}
// app.config.ts
export const appConfig: ApplicationConfig = {
providers: [
provideAbpCore(
withOptions({
tenantKey: "__tenant", // Default
})
),
],
};
A React SPA is created with the modern template:
abp new Acme.BookStore --template app --modern
Acme.BookStore/
├── react/ # React SPA (user interface)
├── src/
│ └── ... # Backend projects
In the microservice template:
Acme.BookStore/
├── apps/react/ # React SPA
├── apps/react-admin-console/ # Admin Console (served by the backend)
├── apps/auth-server/ # OpenIddict Auth Server
├── gateways/web/ # YARP reverse proxy
└── gateways/mobile/ # Mobile gateway
The modern template seeds automatically:
MyProjectName_App — React SPAMyProjectName_AdminConsole — Admin Consoleabp new Acme.BookStore --modern --shadcn-theme blue
Theme values: slate, pink, blue, turquoise, orange, purple
With the ABP UI theming system, you can use pre-built themes or custom themes.
| Theme | Description | License |
|---|---|---|
leptonx | LeptonX (full) | Team+ |
leptonx-lite | LeptonX Lite | Free |
basic | Basic Theme | Free |
abp new Acme.BookStore --theme leptonx-lite
abp new Acme.BookStore --theme basic
[DependsOn(
typeof(AbpAspNetCoreMvcUiBasicThemeModule)
)]
public class MyWebModule : AbpModule { }
public static class BookStorePermissions
{
public const string GroupName = "BookStore";
public const string Books = GroupName + ".Books";
public const string BooksCreate = Books + ".Create";
public const string BooksUpdate = Books + ".Update";
public const string BooksDelete = Books + ".Delete";
}
public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName);
var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books);
booksPermission.AddChild(BookStorePermissions.BooksCreate);
booksPermission.AddChild(BookStorePermissions.BooksUpdate);
booksPermission.AddChild(BookStorePermissions.BooksDelete);
}
}
@* MVC/Razor *@
@if (await AuthorizationService.IsGrantedAsync(BookStorePermissions.BooksCreate))
{
<button>Create Book</button>
}
@* Blazor *@
<Authorize Policy="BookStore.Books.Create">
<button>Create Book</button>
</Authorize>
public class BookStoreMenuContributor : IMenuContributor
{
public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenuAsync(context);
}
}
private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
context.Menu.AddItem(
new ApplicationMenuItem(
"BookStore",
l["Menu:BookStore"],
icon: "fa fa-book"
).AddItem(
new ApplicationMenuItem(
"BookStore.Books",
l["Menu:Books"],
url: "/Books"
)
)
);
return Task.CompletedTask;
}
}
--modern flagnpx claudepluginhub burakdmir/abp-skills --plugin abp-senseiProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.