--- description: "ABP Blazor UI patterns and components" globs: - "**/*.razor" - "**/Blazor/**/*.cs" - "**/*.Blazor*/**/*.cs" alwaysApply: false --- # ABP Blazor UI > **Docs**: https://abp.io/docs/latest/framework/ui/blazor/overall ## Component Base Classes ### Basic Component ```razor @inherits AbpComponentBase

@L["Books"]

``` ### CRUD Page ```razor @page "/books" @inherits AbpCrudPageBase

@L["Books"]

@if (HasCreatePermission) { }
``` ## Localization ```razor @* Using L property from base class *@

@L["PageTitle"]

@* With parameters *@

@L["WelcomeMessage", CurrentUser.UserName]

``` ## Authorization ```razor @* Check permission before rendering *@ @if (await AuthorizationService.IsGrantedAsync("MyPermission")) { } @* Using policy-based authorization *@

You have access!

``` ## Navigation & Menu Configure in `*MenuContributor.cs`: ```csharp public class MyMenuContributor : IMenuContributor { public async Task ConfigureMenuAsync(MenuConfigurationContext context) { if (context.Menu.Name == StandardMenus.Main) { var bookMenu = new ApplicationMenuItem( "Books", l["Menu:Books"], "/books", icon: "fa fa-book" ); if (await context.IsGrantedAsync(MyPermissions.Books.Default)) { context.Menu.AddItem(bookMenu); } } } } ``` ## Notifications & Messages ```csharp // Success message await Message.Success(L["BookCreatedSuccessfully"]); // Confirmation dialog if (await Message.Confirm(L["AreYouSure"])) { // User confirmed } // Toast notification await Notify.Success(L["OperationCompleted"]); ``` ## Forms & Validation ```razor
@L["Name"]
``` ## JavaScript Interop ```csharp @inject IJSRuntime JsRuntime @code { private async Task CallJavaScript() { await JsRuntime.InvokeVoidAsync("myFunction", arg1, arg2); var result = await JsRuntime.InvokeAsync("myFunctionWithReturn"); } } ``` ## State Management ```csharp // Inject service proxy from HttpApi.Client @inject IBookAppService BookAppService @code { private List Books { get; set; } protected override async Task OnInitializedAsync() { var result = await BookAppService.GetListAsync(new PagedAndSortedResultRequestDto()); Books = result.Items.ToList(); } } ``` ## Code-Behind Pattern **Books.razor:** ```razor @page "/books" @inherits BooksBase ``` **Books.razor.cs:** ```csharp public partial class Books : BooksBase { // Component logic here } ``` **BooksBase.cs:** ```csharp public abstract class BooksBase : AbpComponentBase { [Inject] protected IBookAppService BookAppService { get; set; } } ```