Imaginad que tenemos un controlador MVC como el siguiente:
public class TestController : Controller
{
public IActionResult Add(int a, int b)
{
return Content($"Result: {a + b}");
}
}
Claramente, la acción Add()
retornará la suma de los enteros a
y b
que le llegarán como parámetros de la query string:
GET https://localhost:7182/test/add?a=1&b=2 HTTP/1.1
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Result: 3
Pero, como sabemos, podríamos llamar a la acción sin indicar alguno de esos parámetros, o incluso ninguno de ellos:
Petición | Respuesta |
---|---|
GET /test/add?a=1&b=2 | Result: 3 |
GET /test/add?a=0&b=0 | Result: 0 |
GET /test/add?a=1 | Result: 1 |
GET /test/add | Result: 0 |
Esto es así porque el binder será capaz de poblar correctamente los parámetros a
y b
cuando estén presentes en la cadena de la petición y sean correctos, o les asignará su valor por defecto (0
) cuando no hayan sido suministrados.
Pero dado que el cero es un valor de entrada válido, a priori desde nuestro código no tendríamos forma de distinguir cuándo el parámetro ha sido omitido y cuándo se ha establecido expresamente.
¿Cómo podríamos hacerlo?
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: aspnetcore, aspnetcoremvc, trucos
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- 7 Hábitos de personas altamente innovadoras
José María Aguilar - Streaming en gRPC, parte II: Streaming bidireccional
José María Aguilar
.NET Core / .NET
- ¿Se ha vuelto demasiado complejo C#?
Eduard Tomás - Cómo manejar JSON en .NET con System.Text.Json
José Manuel Alarcón - Ejemplo de un método deshonesto en C# .NET y cómo refactorizarlo
Albert Capdevila - C# 11 Preview Updates - Raw string literals, UTF-8 and more!
Kathleen Dollard - A Time-Scoped Registration Mechanism for Microsoft.Extensions.DependencyInjection
David Kröll - Running JavaScript inside a .NET app with JavaScriptEngineSwitcher
Andrew Lock - Internals of C# nullable reference types - Migrating to nullable reference types
Maarten Balliauw - Using dotnet format Command to Format the C#/.NET Code
Ryan Miranda - C# async await explained
Patrick Smacchia - Building a NuGet Packages Architecture Part 6 - Enhancing your packages
Imar Spaanjaars - C# Tip: How to temporarily change the CurrentCulture
Davide Bellone - Async and Async Void Event Handling in WPF
Rick Strahl - C# Code Rules
Christian Findlay - Running and Debugging Multiplatform .NET Core (.NET5 or .NET6) GUI and Console Applications on Windows Subsystem for Linux (WSL)
Nick Polyak
La semana pasada veíamos algunas alternativas para comprobar de forma eficiente si una cadena de texto contiene un JSON válido y, al hilo de dicho post, el amigo Javier Campos aportó vía Twitter una fórmula adicional mejor que las que vimos aquí.
El código en cuestión es el siguiente:
public bool IsJsonWithReader(string maybeJson)
{
try
{
var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(maybeJson));
reader.Read();
reader.Skip();
return true;
}
catch
{
return false;
}
}
La estructura Utf8JsonReader ofrece una API de alto rendimiento para acceder en modo forward-only y read-only al JSON presente en una secuencia de bytes UTF8. Los métodos Read()
y Skip()
se encargan respectivamente de leer el primer token del JSON y saltarse todos sus hijos, con lo que en la práctica se recorrerá el documento completo, lanzándose una excepción en caso de ser inválido.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Streaming en gRPC, parte I: Streaming unidireccional
José María Aguilar - Variables locales implicítamente tipadas en C#
José María Aguilar
.NET Core / .NET
- Announcing .NET 7 Preview 3
Jon Douglas - Nullable reference types in C# - Migrating to nullable reference types
Maarten Balliauw - Getting Disk information in Windows with C#
Bruno Sonnino - Reflected Image in C# with GDI and Unchecked Code
AdventureDriver - .NET Automatic Updates for Server Operating Systems
Jamshed Damkewala - Keeping up with .NET: learning about new features and APIs
Andrew Lock - Adding Alt Text To Twitter Images Using C#
Khalid Abuhakmeh - Warning on lower case type names in C# 11
Jared Parsons - Faster .NET development on Kubernetes with Skaffold
Salvatore Merone - Introducing Central Package Management
Jeff Kluge - Using the Roslyn APIs to Analyse a .NET Solution
Steve Gordon - Deep C# - Interface
Mike James - Discussing alternative memory management strategy for .NET
Mark Pelf - Dissecting AutoMapper Programming Horror
Jimmy Bogard - Ignoring JSON Key Casing and Numbers as Strings when Deserializing with System.Text.Json
Bryan Hogan
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Ojo con la inicialización de propiedades usando expression bodied members
José María Aguilar - 13 Consejos para comentar tu código
José María Aguilar
.NET Core / .NET
- .NET Framework 4.5.2, 4.6, and 4.6.1 will reach End of Support on Apr 26, 2022
Jamshed Damkewala - How to prevent Email HTML injection in C# and .NET
Niels Swimberghe - Implementing OAuth2 Client credentials flow APP to APP security using Azure AD non interactive
Damien Bowden - GDI/User Object Leak Tracking – The Easy Way
Alois Kraus - Creating and Using HTTP Client SDKs in .NET 6
Oleksii Nikiforov - Must-Know Concepts Related to LINQ and IEnumerable
Ioannis Kyriakidis - How segments and regions differ in decommitting memory in the .NET 7 GC
Maoni Stephens - C# Pattern Matching Explained
Patrick Smacchia - C# Tip: Use Debug-Assert to break the debugging flow if a condition fails
Davide Bellone - Value types and exceptions in .NET profiling
Christophe Nasarre - Forcing HttpClient to use IPv4 or IPv6 addresses
Gérald Barré - Challenge: Why is this code broken?
Oren Eini - Speed Up Logging in .NET
David McCarter
Al hilo del post Cómo recibir un JSON como string en una acción ASP.NET Core MVC, el amigo Alberto dejaba una interesante pregunta en los comentarios: ¿y si una vez hemos recibido el string
, queremos validar que sea un JSON válido?
Obviamente, una forma sencilla sería intentar deserializarlo por completo a la clase de destino, siempre que ésta sea conocida. Para ello podríamos utilizar el método Deserialize<T>()
del objeto JsonSerializer
de System.Text.Json
, disponible en todas las versiones modernas de .NET, de la siguiente manera: