Ich gebe Daten mithilfe von fetch in meinen Client-js-Skripts
fetch('/myarea/mycontroller/myaction', {
method: 'post',
body: JSON.stringify({ name: namevalue, address: addressvalue })
})
.then(function (response) {
if (response.status !== 200) {
console.log('fetch returned not ok' + response.status);
}
response.json().then(function (data) {
console.log('fetch returned ok');
console.log(data);
});
})
.catch(function (err) {
console.log(`error: ${err}`);
});
}, false);
Dann auf meinem Controller
[HttpPost]
public async Task<IActionResult> MyAction(string name, string address)
{
// Error, name and address is null here, shouldn't be!
// more code here ...
}
Meine Controller-Aktion wird korrekt aufgerufen und ich kann darin debuggen, es werden jedoch keine Daten übergeben. Was könnte hier falsch sein? Vielen Dank
Die Controller-Aktion erwartet Abfrageparameter (/myaction?name=myname&address=myaddress
). Das ist die Standardeinstellung ... Sie senden sie in den Körper.
Sie können das Javascript ändern, um sie als Abfrageparameter zu senden. (siehe hier: https://github.com/github/fetch/issues/256 )
Oder Sie können die Controller-Aktion anweisen, die Werte aus dem Körper zu übernehmen:
[HttpPost]
public async Task<IActionResult> MyAction([FromBody] Person person)
{
var myName = person.Name;
}
public class Person
{
public string Name {get; set; }
public string Address {get; set; }
}
Oder wenn Sie <form>...</form>
hätten, könnten Sie verwenden
fetch('/url', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: $('#editContactModal form').serialize()
// body like "id=1&clientid=3&name=me&phones=123&[email protected]"
})
ohne [FromBody] !!! (nur mit regulärer Aktionsmethode im Controller)
Das [FromBody] -Attribut trat für mich erst ein, nachdem ich den Header als "application/json" definiert hatte:
fetch('api/Profile/Update', {
method: 'post',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ description: "Some text here" })
});
Und so sieht die Controller-Aktion aus:
[HttpPost("[action]")]
public async Task<IActionResult> Update([FromBody] ProfileUpdateModel profileUpdateModel)
{
//Do some stuff here...
return RedirectToAction("/", "HomeController");
}
Und die Eigenschaft description erhält jetzt den Wert von der Anforderung. Ich hoffe, dass dies jemandem, der sich mit dem Thema beschäftigt, endgültige Klarheit verschafft.