web-dev-qa-db-de.com

Post FromBody Immer NULL

Ich habe eine neue API, die ich mit ASP.NET Core entwickle, und ich kann keine Daten auf einen Endpunkt POST-fähig machen. 

So sieht der Endpunkt aus:

[HttpPost]
[Route("StudentResults")]
public async Task<IActionResult> GetStudentResults([FromBody]List<string> userSocs, [FromBody]int collegeId)
{
    var college = await _collegeService.GetCollegeByID(collegeId);
    // var occupations = await _laborMarketService.GetOccupationProgramsBySocsAndCollege(userSocs, college);
    return Ok();
}

Und so sieht meine Nutzlast aus, die ich durch Postman schicke:

{
    "userSocs": [
            "291123",
            "291171",
            "312021",
            "291071",
            "152031",
            "533011"
        ],
    "collegeId": 1
}

Ich stelle sicher, dass ich einen Postbote als POST gesetzt habe, mit Content-Type application/json. Was mache ich falsch? 

18
Alex Kibler

Sie erhalten immer null, da Sie alle Ihre Post-Variablen in nur einem Objekt kapseln müssen. So was: 

public class MyPostModel {
    public List<string> userSocs {get; set;}
    public int collegeId {get; set;}
}

und dann 

public async Task<IActionResult> GetStudentResults([FromBody] MyPostModel postModel)
34
Tinwor

Wenn das Modell null ist, überprüfen Sie Folgendes:

1) Wo werden die Daten gesendet: Body, Formular? und basierend darauf den Dekorateur der Aktion hinzufügen. Für ex:

[HttpPost]
public JsonResult SaveX([FromBody]MyVM vm) { ... }

2) ModelState prüfen : Wenn es ungültig ist, wird die VM nicht gebunden, also null.

if (ModelState.IsValid) { ... }

Ich weiß, dass es nichts mit Ihrem Fall zu tun hat, aber ich poste hier meine Antwort. Es ist ein dummer Fehler, den ich in meinem Code gemacht habe. Ich habe gerade eine meiner Get-Anfragen kopiert und in Post-Anfrage geändert. Ich habe vergessen, den Parameter mit [FromBody] zu dekorieren. Wenn jemand anderes das gleiche Problem hat, vergewissern Sie sich, dass Sie den Parameter mit [FromBody] dekorieren.

[HttpPost]
public IApiResponse Update([FromBody] User user) {
 if (user == null) return new ApiBadRequestResponse(ModelState);
 return _userService.Post(user) ? new ApiOkResponse(user) : new ApiResponse(500);
}
1
Sibeesh Venu

wenn Sie zwei oder mehr Modelle versenden möchten, sollten Sie dieses Beispiel verwenden

    [HttpPost]
    public async Task<ActionResult> addUsuario([FromBody] Newtonsoft.Json.Linq.JObject datos)
    {
        Usuarios user = datos["usuario"].ToObject<Usuarios>();
        Empresas empresa = datos["empresa"].ToObject<Empresas>();
       return  Json(await _srv.addUsuario(user, empresa));
    }
0