Vinicius Quinafelex Alves

🌐English version

[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.