AstrolUI AstrolUI
Amarillo Naranja Rojo Verde Azul Morado Color propio
Modo claro
Extensiones .NET

Astrol.Entities.Basic: métodos de extensión para texto, números, fechas, consultas de AstrolGrid, colores, enumeraciones y JSON.

Astrol.Entities.Basic se instala con Astrol.Component.Basic y trae métodos de extensión para lo que casi toda aplicación repite: limpiar y buscar texto, mostrar importes y fechas, paginar en el servidor o elegir un color de texto legible. Todos aceptan null y no lanzan excepciones por un valor vacío. Son C# puro: sirven igual en Blazor, en una API o en un servicio.

@* Installed with Astrol.Component.Basic (package Astrol.Entities.Basic) *@
@using Astrol.Entities.Basic.Static.Extensions
@using Astrol.Entities.Basic.Static @* Auxiliar.NewKey(), Auxiliar.NewDomId() *@

1. Texto

ToSearchKey deja el texto en minúsculas, sin tildes ni ñ y con un solo espacio entre palabras: compare dos claves y la búsqueda funciona aunque el usuario escriba «configuracion» o «CONFIGURACIÓN» (AstrolComboBox lo usa así). ContainsIgnoreAccents lo hace en una sola llamada. También hay slugs para URLs, iniciales para avatares, nombres con mayúscula inicial, recortes con «…», validación de correo y de extensiones de archivo.

Escriba en la demostración para ver el resultado de cada método.

ToSearchKey() asley fernandez cruz — configuracion ToSlug() asley-fernandez-cruz-configuracion ToTitleCase() Asley Fernández Cruz — Configuración GetInitials() AC Truncate(18) Asley Fernánd… RemoveDiacritics() Asley Fernandez Cruz — Configuracion IsValidEmail() False
// Search without accents or case (filters, combos, lists)
var term = search.ToSearchKey(); // " Árbol " -> "arbol"
var result = clients.Where(c => c.Name.ContainsIgnoreAccents(search));
 
string slug = "¡Hola, Año 2026!".ToSlug(); // "hola-ano-2026"
string name = "jUAN pérez".ToTitleCase(); // "Juan Pérez"
string avatar = user.FullName.GetInitials(); // "AC"
string preview = article.Body.RemoveHtmlTags().Truncate(120);
string phone = "5512345678".FormatPhoneNumber(); // "(551) 234 5678"
string label = user.Nickname.IfEmpty("(no name)");
 
bool ok = email.IsValidEmail();
bool allowed = file.Name.IsAllowedExtension(new[] { ".pdf", ".png" });
string tags = product.Tags.JoinText(", "); // skips null / empty

2. Números, dinero y tamaños

ToMoney usa el formato de moneda de la cultura actual (separadores y símbolo correctos en es-MX, en-US, es-ES...) y puede añadir el código de la moneda. ToCompact abrevia cifras grandes para tarjetas y gráficas. PercentOf devuelve 0 cuando el total es 0, sin dividir entre cero. ToFileSize muestra el tamaño de un archivo en la unidad adecuada.

ToMoney() 1.234.567,89 ¤ ToMoney("MXN") 1.234.567,89 ¤ MXN ToCompact() 1,2M ApplyPercent(16) 197530,86 PercentOf(10000) 12345,68 % ((long)n).ToFileSize() 1,2 MB
string price = 1234.5m.ToMoney(); // "$1,234.50" (current culture)
string mxn = 1234.5m.ToMoney("MXN"); // "$1,234.50 MXN"
string visits = 3_400_000L.ToCompact(); // "3.4M" (cards and charts)
 
decimal tax = subtotal.ApplyPercent(16); // 16 % of the subtotal
decimal progress = done.PercentOf(total); // 0 when total is 0
 
string size = file.Size.ToFileSize(); // "1.5 MB"
long max = 5L.ToBytes(TypeStorage.Megabyte); // 5 242 880

3. Fechas

ToRelativeTime escribe «hace 5 minutos» o «5 minutes ago» según el idioma de la aplicación; una fecha UTC se compara con la hora UTC. ToDisplay da formato a fechas que pueden ser null (devuelve una cadena vacía) y puede pasarlas antes a la hora local. Los inicios y finales de día, semana y mes simplifican los filtros por rango, y EndOfDay incluye todo el último día.

-40 s ahora mismo -5 min hace 5 minutos -3 h hace 3 horas +2 d en 2 días -14 m hace 1 año ToDisplay() 24/10/2026 22:41 ToDisplay("D") sábado, 24 de octubre de 2026 StartOfWeek() 19/10/2026 EndOfMonth() 31/10/2026
string when = comment.CreatedAt.ToRelativeTime(); // "hace 5 minutos" / "5 minutes ago"
string text = order.Date.ToDisplay(); // "24/10/2026 12:00" ("" if null)
string local = order.DateUtc.ToDisplay("g", toLocalTime: true);
 
// Date range filters
var from = DateTime.Today.StartOfMonth();
var to = DateTime.Today.EndOfDay();
var orders = db.Orders.Where(o => o.Date >= from && o.Date <= to);
 
int age = client.BirthDate.GetAge();
bool weekend = DateTime.Today.IsWeekend();

4. Consultas para AstrolGrid

Para la tabla en modo servidor: SortList ordena por la columna que pide la tabla (también rutas anidadas como «Cliente.Nombre») construyendo una expresión que EF Core traduce a SQL; Paginate toma la página pedida y ToPaginatedResponse hace las tres cosas (ordenar, contar y paginar) y devuelve lo que espera AstrolGrid. WhereIf aplica un filtro solo si el usuario lo rellenó. Con EF Core asíncrono, combine SortList y Paginate con CountAsync y ToListAsync.

// AstrolGrid in server mode: optional filters + sort + count + page
private async Task ReadItems(GridResponse<Client> request)
{
 var query = db.Clients
 .WhereIf(onlyActive, c => c.Active)
 .WhereIf(search.HasValue(), c => c.Name.Contains(search!));
 
 request.AstrolPaginatedResponse = query.ToPaginatedResponse(request.GridInfo);
}
 
// Async EF Core: the same steps by hand
var sorted = query.SortList(request.GridInfo.SortInfo); // x => x.Name, nested "Client.Name"
request.AstrolPaginatedResponse = new()
{
 TotalItems = await query.CountAsync(),
 PageItems = await sorted.Paginate(request.GridInfo).ToListAsync(),
};

5. Colores

GetColorContrast elige el color de texto (blanco u oscuro, o los que indique) con más contraste sobre un fondo, según la fórmula de WCAG: útil para etiquetas o tarjetas con un color elegido por el usuario. GetContrastRatio da la relación de contraste (4.5 es el mínimo AA para texto normal) e IsHexColor / NormalizeHexColor validan y normalizan lo que se escriba en un campo de color.

AstrolUI
GetColorContrast() #222222 GetContrastRatio("#fff") 1,53 GetContrastRatio("#222") 10,39
@* Readable text on a color chosen by the user *@
<span style="background:@tag.Color; color:@tag.Color.GetColorContrast()">@tag.Name</span>
 
@code {
 bool valid = input.IsHexColor(); // #rgb, #rrggbb, with or without #
 string? hex = "FA0".NormalizeHexColor(); // "#ffaa00"
 double ratio = "#facc15".GetContrastRatio("#222"); // >= 4.5: WCAG AA for text
}

6. Enumeraciones, JSON, colecciones y copias

GetDisplayName lee [Display(Name)] o [Description] de un valor de enumeración y ToSelectList convierte la enumeración en opciones para un combo. DeepClone crea una copia independiente (para editar en un modal y poder cancelar). ToJson / FromJson usan System.Text.Json con las opciones web y FromJson devuelve default si el texto no es válido.

public enum OrderStatus
{
 [Display(Name = "Pending payment")] Pending,
 [Description("Shipped")] Shipped,
 Delivered,
}
 
string text = order.Status.GetDisplayName(); // "Pending payment"
List<SelectList<OrderStatus>> options = EnumExtensions.ToSelectList<OrderStatus>(); // for an AstrolComboBox
 
// Edit a copy in a modal and discard it on Cancel
var draft = client.DeepClone();
 
string json = filters.ToJson(); // camelCase
var filters = json.FromJson<Filters>(); // default if empty or invalid
 
if (items.IsNullOrEmpty()) { /* ... */ }
foreach (var item in maybeNull.OrEmpty()) { /* ... */ }
 
string key = Auxiliar.NewKey(32); // random alphanumeric key
string id = Auxiliar.NewDomId(); // "aui-k3f9x2" for label for="..."

Referencia

Texto (StringExtensions)

  • HasValue(), IfEmpty(fallback), Truncate(max, ellipsis)
  • ToSearchKey(), ContainsIgnoreAccents(term), RemoveDiacritics(keepEnye)
  • RemoveWhitespace(), CollapseWhitespace(), RemoveHtmlTags()
  • ToTitleCase(culture), Capitalize(), ToSlug(maxLength), GetInitials(max)
  • DigitsOnly(), FormatPhoneNumber(), IsValidEmail()
  • IsAllowedExtension(extensions), JoinText(separator, skipEmpty)
  • Obfuscate(key) / Deobfuscate(key): la ofuscación del almacenamiento del navegador; no es cifrado.

Números y tamaños (NumberExtensions, FileSizeExtensions)

  • PercentOf(total, decimals), ApplyPercent(percent, decimals)
  • ToMoney(currencyCode, culture, decimals), ToCompact(decimals, culture)
  • ToFileSize(decimals), ToKilobytes(), ToMegabytes(), ToBytes(TypeStorage)

Fechas (DateExtensions)

  • ToDisplay(format, toLocalTime, culture) para DateTime, DateTimeOffset y sus versiones null
  • ToRelativeTime(now, culture)
  • StartOfDay(), EndOfDay(), StartOfWeek(firstDay), StartOfMonth(), EndOfMonth(), IsWeekend(), GetAge(today)

Consultas y colecciones (AstrolQueryableExtensions, CollectionExtensions)

  • SortList(SortInfo | json), Paginate(GridInfo), WhereIf(condition, predicate), ToPaginatedResponse(GridInfo)
  • IsNullOrEmpty(), HasItems(), OrEmpty(), WhereIf para IEnumerable

Colores, enumeraciones, JSON y copias

  • GetColorContrast(light, dark), GetContrastRatio(other), IsHexColor(), NormalizeHexColor()
  • GetDisplayName(), EnumExtensions.ToSelectList<TEnum>()
  • ToJson(indented), FromJson<T>()
  • DeepClone()
  • Auxiliar.NewKey(length), Auxiliar.NewDomId(prefix)

Las extensiones de estilo (GetButtonStyle, GetBoxStyle, GetThemeColor...) las usan los componentes internamente.

Markdown para IA © 2026 AstrolUI v10.0.13