webentwicklung-frage-antwort-db.com.de

Verwechselt mit FromBody in ASP.NET Core

Ich habe die folgende WEB-API-Methode und eine SPA-Vorlage mit Angular:

[HttpPost]
public IActionResult Post([FromBody]MyViewModel model)

Ich dachte, basierend auf this topic, muss hier nicht [FromBody] Verwendet werden, da ich den Wert aus dem Nachrichtentext lesen möchte, sodass der Standardwert nicht überschrieben werden muss Verhalten, aber wenn ich nicht [FromBody] verwende, ist das Modell, das von Angular) stammt, null. Ich bin wirklich verwirrt, warum sollte ich [FromBody], da ich das Standardverhalten verwendet habe?

11
J.P

Die Frage, auf die Sie verweisen, bezieht sich auf web-api. Sie verwenden core-mvc, das neu geschrieben wurde, um die Pipelines für die vorherigen Versionen von mvc und web-api in einer Klasse Controller zusammenzuführen.

Beim Posten von json (in Anlehnung an x-www-form-urlencoded) Ist das Attribut [FromBody] Erforderlich, um das Attribut ModelBinder anzuweisen, den Inhaltstyp-Header zu verwenden, um die IInputFormatter zum Lesen der Anfrage.

Eine ausführliche Erläuterung der Modellbindung an json in core-mvc finden Sie unter Modellbindung von JSON-POSTs in ASP.NET Core .

10
user3559349

Wenn Sie dieses Problem sehen, müssen Sie den [ApiController] zu dem Controller hinzufügen, in dem Sie ControllerBase erweitern. Der [FromBody] wird nur benötigt, wenn Sie einen MVC-Controller verwenden.

Dadurch wird der Körper automatisch so verarbeitet, wie Sie es erwarten.

Microsoft-Dokumentation für das ApiController-Attribut

0
Rob

Und hier ist ein alternativer Ansatz, vorausgesetzt, Sie müssen beide unterstützen [FromForm] und [FromBody] in Ihrer Controller-API…

Front-End (Winkelcode):

forgotPassword(forgotPassword: ForgotPassword): Observable<number> {
  const params = new URLSearchParams();
  Object.keys(forgotPassword).forEach(key => params.append(key, forgotPassword[key]));
  return this.httpClient.post(`${this.apiAuthUrl}/account/forgotpassword`, params.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
}

Back-End (C # -Code):

[AllowAnonymous]
[HttpPost("[action]")]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model) { }

Jetzt kann Ihre Signatur dieselbe bleiben, sodass beide unterstützt werden.

Und ein weiterer dauerhafterer Ansatz, über den ich bei der Ansprache nachgedacht habe.

https://benfoster.io/blog/aspnet-core-customising-model-binding-conventions .

Hoffe es hilft jemandem!

0
Tim Harker