[ASPNET] Porquê o parâmetro da action está nulo
Em algumas situações, o parâmetro da action que recebe os dados enviados pelo usuário pode estar vindo nulo. As principais explicações são:
1. Hidratação está sendo feita pelo lugar errado
O comum seria que o servidor devolvesse o erro HTTP 415, mas algumas versões antigas do dotnet não disparam esse erro e simplesmente alimentam o parâmetro com nulo.
Use [FromForm] para tags <form>, Multipart Form e Form URL Encoded POSTs.
Use [FromBody] para POSTs JSON.
Use [FromRoute] para buscar dados na rota da URL.
Use [FromQuery] para buscar dados enviados na query da URL (parametrizados depois do ponto de interrogação "?" na URL)
[HttpPost]
public IActionResult Example([FromForm]DataModel data)
{
/* Implementation */
}
2. O dado de algum das propriedades está nulo ou tem um formato que não consegue ser deserializado
Propriedades não-anuláveis não podem ser hidratados se o dado enviado for nulo ou não estiver em um formato correto. Por exemplo, variáveis tipo Guid por padrão só podem ser hidratados se estiverem com traços (-), e variáveis tipo DateTime terão menos problemas se os dados estiverem no formato ISO.
{
"ValidNumbers": [123, 123.45, "123", "123.45"],
"ValidGuids": ["7e31022d-b955-4b74-bcaf-82660196480b"],
"ValidDates": ["2022-01-01", "2022-01-01T12:00:00", "2022-01-01T12:00:00-03:00"]
}
Mesmo propriedades anuláveis não podem ser hidratados se a propriedade for primitiva, e o dado enviado foi um array ou um objeto.
{
"ObjectProperty:" {},
"ArrayProperty": []
}
Caso não tenha controle sobre o formato de entrada, este artigo explica como é possível altera os formatos de serialização e deserialização do ambiente do ASPNET.