Entity Framework Core service base classes with CRUD operations and database migration helpers for ASP.NET Core.
$ dotnet add package NuvTools.AspNetCore.EntityFrameworkCoreA suite of helper libraries designed to simplify and enhance ASP.NET Core application development. These libraries target modern .NET platforms, including .NET 8, .NET 9, and .NET 10.
ASP.NET Core helpers including composite localization.
Key Features:
Entity Framework Core helpers for ASP.NET Core.
Key Features:
Blazor services for browser APIs and common functionality.
Key Features:
RunAsync helperMudBlazor components and utilities for Blazor applications.
Key Features:
Install via NuGet Package Manager:
# For general ASP.NET Core helpers
dotnet add package NuvTools.AspNetCore
# For Entity Framework Core helpers (includes NuvTools.AspNetCore)
dotnet add package NuvTools.AspNetCore.EntityFrameworkCore
# For Blazor JavaScript interop services
dotnet add package NuvTools.AspNetCore.Blazor
# For MudBlazor components and utilities
dotnet add package NuvTools.AspNetCore.Blazor.MudBlazor
Or via Package Manager Console:
Install-Package NuvTools.AspNetCore
Install-Package NuvTools.AspNetCore.EntityFrameworkCore
Install-Package NuvTools.AspNetCore.Blazor
Install-Package NuvTools.AspNetCore.Blazor.MudBlazor
Set up multiple localization sources with prefix-based routing:
// In Program.cs or Startup.cs
services.AddCompositeLocalizer(
namedResourceTypes: new Dictionary<string, Type>
{
["Errors"] = typeof(ErrorResources),
["Messages"] = typeof(MessageResources)
},
unnamedResourceTypes: new[] { typeof(SharedResources) }
);
// In your code
public class MyService
{
private readonly CompositeLocalizer _localizer;
public MyService(CompositeLocalizer localizer)
{
_localizer = localizer;
}
public string GetMessage()
{
// Use prefix to target specific localizer
var error = _localizer["Errors:ValidationFailed"];
// Or let it search all localizers
var message = _localizer["WelcomeMessage"];
return message;
}
}
Apply migrations automatically on startup:
// In Program.cs
var app = builder.Build();
// Apply migrations with default timeout
app.DatabaseMigrate<MyDbContext>();
// Or with custom timeout
app.DatabaseMigrate<MyDbContext>(TimeSpan.FromMinutes(5));
app.Run();
Manage loading indicators with nested call support:
// Register in Program.cs (or use services.AddBlazorServices() to register all)
services.AddLoadingService();
// In your component
@inject ILoadingService LoadingService
@implements IDisposable
<MudOverlay Visible="LoadingService.IsLoading" DarkBackground="true">
<MudProgressCircular Color="Color.Primary" Indeterminate="true" />
</MudOverlay>
@code {
protected override void OnInitialized()
{
LoadingService.OnChange += StateHasChanged;
}
private async Task LoadData()
{
// Option 1: Manual Show/Hide (supports nesting)
LoadingService.Show();
try { await FetchData(); }
finally { LoadingService.Hide(); }
// Option 2: RunAsync helper (recommended)
await LoadingService.RunAsync(async () => await FetchData());
}
public void Dispose() => LoadingService.OnChange -= StateHasChanged;
}
Apply input masks to MudTextField components:
@using NuvTools.AspNetCore.Blazor.MudBlazor.Converters
// Custom pattern: A=alphanumeric, N=numeric, L=letter
<MudTextField @bind-Value="LicensePlate"
Converter="@(new PatternStringConverter("LLL-NANN"))" />
United States:
@using NuvTools.AspNetCore.Blazor.MudBlazor.UnitedStates.Converters
<MudTextField @bind-Value="Phone" Label="Phone"
Converter="USDocumentConverters.Phone" />
// Output: (555) 123-4567
<MudTextField @bind-Value="Ssn" Label="SSN"
Converter="USDocumentConverters.Ssn" />
// Output: 123-45-6789
<MudTextField @bind-Value="ZipCode" Label="ZIP Code"
Converter="USDocumentConverters.ZipCode" />
// Output: 90210
// Format directly in code
var formatted = USDocumentConverters.FormatPhone("5551234567");
Brazil:
@using NuvTools.AspNetCore.Blazor.MudBlazor.Brazil.Converters
<MudTextField @bind-Value="MobilePhone" Label="Mobile"
Converter="BrazilianDocumentConverters.MobilePhone" />
// Output: (11) 99999-9999
<MudTextField @bind-Value="Cpf" Label="CPF"
Converter="BrazilianDocumentConverters.Cpf" />
// Output: 123.456.789-00
// Auto-detect mobile vs landline
var formatted = BrazilianDocumentConverters.FormatPhone("11999999999");
Use JavaScript interop for clipboard operations:
@inject ClipboardService ClipboardService
<button @onclick="CopyToClipboard">Copy</button>
<button @onclick="PasteFromClipboard">Paste</button>
@code {
private async Task CopyToClipboard()
{
await ClipboardService.WriteTextAsync("Hello, World!");
}
private async Task PasteFromClipboard()
{
var text = await ClipboardService.ReadTextAsync();
Console.WriteLine(text);
}
}
This project uses the modern .slnx solution format (Visual Studio 2022 v17.11+).
# Clone the repository
git clone https://github.com/nuvtools/nuvtools-aspnetcore.git
cd nuvtools-aspnetcore
# Build the solution
dotnet build NuvTools.AspNetCore.slnx
# Run tests
dotnet test NuvTools.AspNetCore.slnx
# Create release packages
dotnet build NuvTools.AspNetCore.slnx --configuration Release
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.