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?
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 .
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.
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!