web-dev-qa-db-fra.com

Comment passer un objet javascript à un contrôleur C # MVC 4

Dans MVC4, comment passez-vous un objet javascript à un contrôleur C # dans AJAX? Finalement j'ai essayé mais ça n'a pas marché.

côté client Javascript:

    var myData = {Propr1: '', Propr2: ''};
    $.ajax({
        type: 'POST',
        data: JSON.stringify(myData),
        url: '/Home/SubmitMyData',
        contentType: 'application/json',
        dataType: 'json',
        success: alert('Youhou'),
        error: alert('not good')
    });

Méthode côté serveur C #:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel
    {
        string Prop1 { get; set; }
        string Prop2 { get; set; }
    }

Mon paramètre est toujours nul. J'ai essayé de changer le contentType mais cela ne fonctionne toujours pas. Où sont mes erreurs? J'ai trouvé quelques messages mais je n'ai pas trouvé ce que j'ai fait de mal.

Merci beaucoup.

11
Régis NIOX
  1. Assurez-vous que les noms de propriété correspondent entre le javascript et le modèle C #. Dans votre question, vous aviez Propr1 et Propr2 pour l'objet javascript, mais dans le modèle C #, vous aviez Prop1 et Prop2 (il manque le "r").
  2. Ne pas stringify les données avant de les envoyer, et ne définissez pas dataType sur json. MVC peut très bien analyser une collection de paramètres de publication sans la sérialisation json dans votre code.
  3. Omettez le contentType, ce n'est pas nécessaire. WebAPI devrait détecter automatiquement cela. Vous pouvez le laisser, mais c'est superflu.
  4. Assurez-vous que les propriétés du modèle sont publiques.

côté client Javascript:

    var myData = {Prop1: '', Prop2: ''}; // #1
    $.ajax({
        type: 'POST',
        data: myData, // #2
        url: '/Home/SubmitMyData',
        //contentType: 'application/json', #3
        //dataType: 'json', #2
        success: alert('Youhou'),
        error: alert('not good')
    });

Méthode côté serveur C #:

    public ActionResult SubmitMyData(MyParamModel myParam)
    {
        // Do my stuff here with my parameter
        return View();
    }

    public class MyParamModel // #4
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
26
danludwig

La valeur que vous passez pour la propriété data doit être un objet, pas une chaîne:

data: myData,

les noms de propriété doivent correspondre:

var myData = { Prop1: '', Prop2: ''};

vous devez utiliser le [FromBody] attribut sur la valeur de votre paramètre:

public ActionResult SubmitMyData([FromBody] MyParamModel myParam)

et les propriétés de votre type de modèle doivent être public:

public class MyParamModel
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}
1
JLRishe