Hoy voy a hablar de un cambio introducido en el framework hace ya algunos años, que, al menos en mi caso, pasó totalmente desapercibido en su momento y durante bastante tiempo después. Y he pensado que sería buena idea publicar sobre ello porque, como este mundo es así de grande, seguro que hay todavía algún despistado al que podría estar afectando a día de hoy y ni siquiera se ha dado cuenta :)
Como recordaréis, los atributos de validación [EmailAddress]
y [Url]
, presentes en el espacio de nombres System.ComponentModel.DataAnnotations
, los hemos utilizado durante años para asegurar que determinados valores de entrada eran direcciones de correo electrónico y URLs válidas, respectivamente:
public class Blog
{
[Required, EmailAddress]
public string ContactEmail { get; set; }
[Required, Url]
public string Url { get; set; }
}
Desde el principio de los tiempos, aún en ASP.NET "clásico", ambos atributos de validación utilizaban internamente complejas expresiones regulares para comprobar los valores, y la verdad es que funcionaban relativamente bien. Nuestras aplicaciones podían confiar en que valores que hubieran superado dichas validaciones serían, como mínimo, sintácticamente correctos y buenos candidatos a ser direcciones de correo o URLs válidas.
Pues bien, desde la llegada de NET 4.7.2, y luego en .NET Core, [EmailAddress]
y [Url]
ya no funcionan así. En palabras casi textuales del equipo de desarrollo, el objeto de estos dos atributos es simplemente prevenir algunos errores básicos al teclear, y no contemplar todas las posibilidades definidas en las respectivas RFC que describen la sintaxis de dichos valores.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: netcore, netframework, validadores
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Se pueden desarrollar aplicaciones ASP.NET Core con Visual Basic .NET?
José María Aguilar - Cómo invocar funciones Javascript desde Blazor (interop 1/3)
José María Aguilar - Más velocidad de carga y mejor SEO en tus apps Blazor WebAssembly mediante prerrenderización
José María Aguilar
.NET Core / .NET
- What I Learned About C# From Job Interviews
Michael Shpilt - ICYMI C# 8 New Features: Write Less Code with Using Declarations
Jason Roberts - Create Anonymous Data Object With AutoFixture From Type
Adam Storr - Tracing IO in .NET Core
Jonathan Channon - A C# Implementation of McCarthy’s Ambiguity Operator
Jorge L Orejel - Substring in C#
Mahesh Chand - Developer's Cheat Sheet for C# 9.0
Franco Tiveron - My mental model of Span, Memory and ReadOnlySequence in .NET
Szymon Kulec - Command Line Parser on .NET5
Alexandre Zollinger Chohfi - Common Files In A .NET Solution
Khalid Abuhakmeh

El parser de Blazor de versiones anteriores a la 5.0 era bastante permisivo con los espacios no significativos que los desarrolladores dejamos a la hora de escribir nuestro código de marcado. Es decir, todos los espacios incluidos en el código fuente, fueran importantes o no para el resultado final, formaban parte del proceso de renderización y, por tanto, trasladados tal cual al navegador.
Entendemos por espacio no significativo aquél carácter espacio, tabulador, saltos de línea o similares que el navegador no va a representar visualmente al componer la página. Por ejemplo, un marcado como "<h2>1 2</h2>
" suele representarse en el browser exactamente igual que si hubiéramos enviado "<h2>1 2</h2>
" (salvo que hayamos usado reglas CSS específicas en dirección contraria), porque todos los espacios intermedios son ignorados.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Autenticación JWT en APIs con ASP.NET Core
José María Aguilar - Cómo mostrar y ocultar elementos en Blazor
José María Aguilar
.NET Core / .NET
- ICYMI C# 8 New Features: Switch Expressions
Jason Roberts - PostSharp's Great Reset: Announcing Project "Caravela", a Roslyn-based aspect framework
Gael Fraiteur - .NET 5: How to enable .NET 5 runtime on console apps instead of .NET Core 3.1 ?
Anthony Giretti - Simplifying paths handling in .NET code with the FullPath type
Gérald Barré - Choosing a ServiceLifetime
Jimmy Bogard - Using C# Source Generators to create an external DSL
Luca Bolognese - Chromium WebView2 Control and .NET to JavaScript Interop
Rick Strahl

El desarrollo de EF6.TagWith lo comencé hace algo más de un año, cuando escribía para el blog lo interesante que me parecía el extensor TagWith()
de Entity Framework Core y me preguntaba por qué no existía algo similar para Entity Framework 6.x.
Como recordaréis, la idea era traer a EF "clásico" la posibilidad de añadir a consultas realizadas desde C# un comentario o etiqueta que después podría ser fácilmente visible en trazas, como las proporcionadas por SQL Server Profiler o herramientas de análisis de rendimiento.
No pensé que existieran muchos desarrolladores a los que pudiera interesar, pero con el tiempo esto me ha servido para confirmar que cualquier aportación a la comunidad, por pequeña que sea, puede ayudar a un buen número de personas.
A día de hoy, y por increíble que parezca, este pequeño y humilde paquetito ha sido instalado más de 6.000 veces, con una media de 10 descargas al día, y ha recibido issues y pull requests de desarrolladores que han decidido contribuir a su mejora a través del sitio del proyecto en GitHub. Impresionante.
Pues bien, por fin he podido dedicar un rato a actualizarlo y he publicado su versión 1.2.1. Esta revisión soluciona algunos errores menores y problemas de compatibilidad con proyectos .NET Framework 4.5, además de incluir un par de novedades fruto del feedback recibido de sus usuarios, que describimos a continuación.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Probar scripts en producción sin desplegar nada, y otros usos interesantes de Fiddler
José María Aguilar - Cómo personalizar el mensaje "Loading" de las aplicaciones Blazor WebAssembly
José María Aguilar
.NET Core / .NET
- Introducción a los registros (record) y los objetos inmutables de C# 9
Rubén Rubio - AutoFixture and .NET 5.0 Record Types
Adam Storr - Be Carefull With ZipArchive
Hasan Hasanov - Deep Dive into Open Telemetry for .NET
Muhammad Rehan Saeed - The Many Flavors of .NET
Sean Killeen - Best 20 C# & .NET Blogs
Seb Nilsson - How to use configuration with C# 9 top-level programs
Dave Brock - Flatten Strings with Regex.Replace
Khalid Abuhakmeh - .NET GC Internals mini-series
Konrad Kokosa - Find Prime Numbers With C# 9
Khalid Abuhakmeh