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() *@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.
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 / emptyToMoney 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.
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 MBstring 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 subtotaldecimal 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 880ToRelativeTime 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.
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/2026string 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 filtersvar 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();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 + pageprivate 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 handvar 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(),};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.
#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}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 Cancelvar draft = client.DeepClone(); string json = filters.ToJson(); // camelCasevar 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 keystring id = Auxiliar.NewDomId(); // "aui-k3f9x2" for label for="..."Texto (StringExtensions)
Números y tamaños (NumberExtensions, FileSizeExtensions)
Fechas (DateExtensions)
Consultas y colecciones (AstrolQueryableExtensions, CollectionExtensions)
Colores, enumeraciones, JSON y copias
Las extensiones de estilo (GetButtonStyle, GetBoxStyle, GetThemeColor...) las usan los componentes internamente.