En un proyecto Asp.Net Core 5.0 tengo la ApiController
ruta y el modelo:
[HttpPost("users/{userId:int}/confirm-email")]
public async Task<IActionResult> ConfirmEmail(Model model) { }
public class Model {
[FromRoute] public Int32? UserId { get; set; }
[FromQuery] public String Token { get; set; }
}
Resultado: obtuve lo que esperaba ...
UserId = 10
Token = "ABC"
Intenté recibir el token en el cuerpo y no en el parámetro de consulta:
public class Model {
[FromRoute] public Int32? UserId { get; set; }
[FromBody] public String Token { get; set; }
}
En este caso recibí el error:
"errors": {
"$": [
"The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
Usé Insomnia.Rest para llamar a la API y el cuerpo es:
{
"token": "ABC"
}
Luego intenté agregar [FromBody]
a la acción del controlador:
[HttpPost("users/{userId:int}/confirm-email")]
public async Task<IActionResult> ConfirmEmail([FromBody]Model model) { }
public class Model {
[FromRoute] public Int32? UserId { get; set; }
[FromBody] public String Token { get; set; }
}
Resultado: obtuve el token del cuerpo pero ahora userId es nulo.
UserId = null
Token = "ABC"
He estado probando algunas variaciones pero no puedo entender qué está sucediendo.
También intenté llamar a la API desde Angular y el resultado es el mismo.
¿Alguna idea de lo que me estoy perdiendo?
De forma predeterminada, el enlace de modelo obtiene datos en forma de pares clave-valor de las siguientes fuentes en una solicitud HTTP:
Para cada parámetro o propiedad de destino, las fuentes se escanean en el orden indicado en la lista anterior.
Puede consultar la siguiente captura de pantalla:
Podemos ver que, [FromRoute]
y el [FromForm]
atributo que se aplica a la propiedad no está funcionando. Utiliza las reglas de inferencia predeterminadas para vincular el modelo.
Luego, cuando el [FromBody]
atributo se aplica a un parámetro de tipo complejo (agregue el [FromBody]
atributo a la acción del Controlador), se ignoran los atributos de origen de vinculación aplicados a sus propiedades. Entonces, el UserId
es nulo. Más información detallada, consulte Inferencia de parámetros de origen de enlace y [FromBody]
atributo .
Entonces, en este escenario, para acceder al valor de la ruta y el cuerpo de la solicitud, la forma más fácil es agregar un parámetro en el ConfirmEmail
método, codifique como se muestra a continuación:
[HttpPost("users/{userId:int}/confirm-email")]
public async Task<IActionResult> ConfirmEmail(Model model, [FromRoute]int userid)
{
//set the userid
model.userId = userid;
return Ok("success");
}
El resultado de la siguiente manera:
Además, también puede intentar crear una carpeta de modelos personalizada para vincular el modelo.
Aquí hay algunos artículos relacionados, puede consultarlos:
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras