web-dev-qa-db-fra.com

Comment transmettre des données au contrôleur en utilisant Fetch api dans le noyau asp.net

Je poste des données en utilisant fetch comme ceci dans mes scripts js client

    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);

Puis sur ma manette

    [HttpPost]      
    public async Task<IActionResult> MyAction(string name, string address)
    {
        // Error, name and address is null here, shouldn't be!
        // more code here ...
    }

Mon action de contrôleur est appelée correctement et je peux y déboguer, mais aucune donnée n'est transmise. Quel pourrait être le problème ici? Merci

9
Alexander

L'action du contrôleur attend des paramètres de requête (/myaction?name=myname&address=myaddress). C'est le défaut ... vous les envoyez dans le corps.

Vous pouvez modifier le javascript pour les envoyer en tant que paramètres de requête. (voir ici: https://github.com/github/fetch/issues/256 )

Ou vous pouvez indiquer à l'action du contrôleur de prendre les valeurs du corps:

[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; }
}
5
Erik Božič

Ou si vous aviez <form>...</form> vous pourriez utiliser 

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]"
})

sans [FromBody] !!! (juste avec la méthode d'action régulière dans le contrôleur)

0
Ayaz Zali

L'attribut [FromBody] n'est entré en jeu pour moi qu'après que j'ai défini l'en-tête qu'il s'agit d'un type "application/json":

fetch('api/Profile/Update', {
        method: 'post',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ description: "Some text here" })
    });

Et voici à quoi ressemble l'action du contrôleur:

    [HttpPost("[action]")]
    public async Task<IActionResult> Update([FromBody] ProfileUpdateModel profileUpdateModel)
    {
        //Do some stuff here...
        return  RedirectToAction("/", "HomeController");
    }

Et la propriété de description reçoit maintenant la valeur de la requête. J'espère que cela éclaircira définitivement quelqu'un qui s'attaque au problème.

0
Kia Kaha