No se pueden recibir valores de Route y Body en una llamada POST

Miguel Moura

En un proyecto Asp.Net Core 5.0 tengo la ApiControllerruta 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?

Zhi Lv

De forma predeterminada, el enlace de modelo obtiene datos en forma de pares clave-valor de las siguientes fuentes en una solicitud HTTP:

  • Campos de formulario
  • El cuerpo de la solicitud (para controladores que tienen el atributo [ApiController]).
  • Datos de ruta
  • Parámetros de la cadena de consulta
  • Archivos subidos

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:

ingrese la descripción de la imagen aquí

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 UserIdes 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 ConfirmEmailmé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:

ingrese la descripción de la imagen aquí

Además, también puede intentar crear una carpeta de modelos personalizada para vincular el modelo.

Aquí hay algunos artículos relacionados, puede consultarlos:

Enlace de modelo personalizado en ASP.NET Core

Enlace de modelo personalizado en ASP.NET Core MVC

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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

No se pueden recibir valores de Route y Body en una llamada POST

No se pueden recibir datos POST en nodeJs

no se pueden obtener valores de $ _POST en php en una solicitud ajax

API de Facebook Messenger: no se pueden recibir solicitudes POST

No se pueden reasignar valores en una declaración de linq

No se pueden insertar valores en una base de datos

Consumidor de Kafka: ¿se pueden ejecutar las devoluciones de llamada onPartitionsRevoked y onPartitionsAssigned dentro de una llamada poll ()?

No se pueden insertar valores en una matriz

No se pueden leer los valores de fecha y hora en el formato correcto del archivo de Excel y guardarlo en una base de datos usando Python

Angular 9: no se pueden leer valores en un objeto anidado devuelto por una llamada a la API [indefinido]

No se pueden analizar los valores del archivo JSON y una consulta de diseño

Android: no se pueden recibir datos de PHP

Websockets de Python, no se pueden recibir mensajes

No se pueden hacer eco de los valores en una matriz en Php

¿Cómo una función en Python puede acceder a los valores que se declaran fuera de su bloque y nunca se pasan como argumentos durante su llamada?

No se pueden vincular devoluciones de llamada de eventos en objetos DOM bajo el elemento DOM de una directiva

No se pueden recibir pulsaciones de teclas de Steam y algunos otros programas

No se pueden imprimir los valores del objeto JSON en view.ejs cuando la respuesta del controlador devuelve el objeto JSON cuando se realiza una llamada a la base de datos

¿Cómo usar valores predeterminados y argumentos arbitrarios en una llamada de función en Python?

Cómo enviar una solicitud JSON POST usando Retrofit en Android y recibir una respuesta de cadena

Cómo enviar una solicitud JSON POST usando Retrofit en Android y recibir una respuesta de cadena

¿Se pueden usar devoluciones de llamada con promesas o es de una forma u otra en node.js?

¿Se pueden usar variables globales en una función de devolución de llamada glfw para modificar el estado global?

Mapeo sobre una matriz de objetos: no se pueden obtener valores en el menú desplegable

¿Cómo se pueden agregar valores en una lista de matrices?

¿Cómo se pueden agregar valores en una lista de matrices?

No se pueden escribir valores en una matriz PHP global desde un método de clase

No se pueden extraer varios valores de una consulta en SQLite para Python

No se pueden obtener todas las claves y valores de la matriz en la matriz

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    Kibana 4 , making pie chart , error message

  3. 3

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  4. 4

    récupérer les noms de clés depuis Firebase react-native

  5. 5

    OAuth 2.0 utilizando Spring Security + WSO2 Identity Server

  6. 6

    Cómo eliminar o caducar las cookies en Chrome usando asp.net

  7. 7

    desbordamiento: oculto no funciona al hacer zoom en un iframe de YouTube usando transformar

  8. 8

    Cómo extraer una palabra clave (cadena) de una columna en pandas dataframe en python

  9. 9

    Link library in Visual Studio, why two different ways?

  10. 10

    선언되지 않은 유형 'MessagingDelegate'사용

  11. 11

    actualizar el contenido de la vista de reciclaje falla en la hoja inferior

  12. 12

    Ver todos los comentarios en un video de YouTube

  13. 13

    Problema con la vista de impresión de PDF

  14. 14

    ¿Cómo pintar el Dropline de un RowHeader-JTable en el Main-JTable durante un DragAndDrop?

  15. 15

    Pregunta de fórmula de desplazamiento y transposición de Excel / Google Sheets

  16. 16

    ¿Cómo puedo hacer accesible la información de color en tablas HTML?

  17. 17

    ¿Cómo generalizar el JSON en el procedimiento almacenado?

  18. 18

    Recortar fotos rectangulares de escaneos en OpenCV con Python

  19. 19

    2D 배열에 대한 Numpy 요소 별 평균 계산

  20. 20

    Typescript의 "window"전역 개체에 "adsbygoogle"애드 센스 속성을 추가하는 방법은 무엇입니까?

  21. 21

    Error: la ejecución falló para la tarea ': app: compileDebugJavaWithJavac'. java.io.FileNotFoundException:

CalienteEtiquetas

Archivo