web-dev-qa-db-fra.com

Paramètre de contrôleur ASP.NET mvc 4 toujours null lors de l'envoi de JSON au contrôleur, pourquoi?

Il y a déjà quelques articles similaires ici, et essayé toutes les solutions suggérées, et cela ne fonctionne toujours pas ... Je ne peux pas obtenir de valeur dans le contrôleur, elle est toujours nulle. Ci-dessous le code. Est-ce que je manque quelque chose?

Javascript côté client

   function getChart() {
       JSONString3 = { HAxis : [{ Name : "monday" }] };
       jQuery.ajaxSettings.traditional = true;
        $.ajax({
            url: "@Url.Action("getChart","SBM")",
            type: 'POST',
            contentType: 'json',
            dataType: 'html',
            data: JSONString3,
            success: function (data) {
                var imagestring = btoa(data);
                $('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new       Date().getTime());
            }
        })
        jQuery.ajaxSettings.traditional = false;
    }

Contrôleur MVC

    [Authorize]
    [HttpPost]
    public ActionResult getChart(YAxis HAxis)
    {
        YAxis XAxisvalue = HAxis;
        Charts chart = new Charts();
        MemoryStream ms = new MemoryStream();
        chart.Chart.SaveImage(ms);
        string image = Convert.ToBase64String(ms.GetBuffer());
        return File(ms.GetBuffer(), "image/png", "Chart.png");
    }

Modèle

public class YAxis
{
    public string Name { get; set; }
}
14
Gašper Sladič

Merci les gars pour les directions et les solutions. La solution étant une combinaison de toutes vos suggestions, j'ai donc décidé de l'arrondir en un seul poste.

La solution au problème est la suivante:

  1. contentType devrait être application/json (comme Ant P suggéré ci-dessus)
  2. les données json doivent être sous la forme de JSONString3 = {"Name" : "monday" } (comme Ant P suggéré ci-dessus)
  3. avant d’envoyer au contrôleur, json doit être stringifyed comme suit: JSONString3 = JSON.stringify(JSONString3) (comme suggéré par Quan)

Javascript côté client

function getChart() {
               JSONString3 = { "Name" : "monday" };
               jQuery.ajaxSettings.traditional = true;
                $.ajax({
                    url: "@Url.Action("getChart","SBM")",
                    type: 'POST',
                    contentType: 'application/json',
                    dataType: 'html',
                    data: JSON.stringify(JSONString3),
                    success: function (data) {
                        var imagestring = btoa(data);
                        $('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new       Date().getTime());
                    }
                })
                jQuery.ajaxSettings.traditional = false;
    }

Contrôleur MVC

[Authorize]
[HttpPost]
public ActionResult getChart(YAxis HAxis)
{
    YAxis XAxisvalue = HAxis;
    Charts chart = new Charts();
    MemoryStream ms = new MemoryStream();
    chart.Chart.SaveImage(ms);
    string image = Convert.ToBase64String(ms.GetBuffer());
    return File(ms.GetBuffer(), "image/png", "Chart.png");
}

Modèle

public class YAxis
{
    public string Name { get; set; }
}

Au lieu de cela:

JSONString3 = { "Name" : "monday" };

nous pouvons le faire:

var JSONString3 = {};
JSONString.Name = "monday";

Mais il faut encore formater l'objet avant de l'envoyer au contrôleur !!!

Pour transmettre plusieurs objets au contrôleur, voici l'exemple

Javascript côté client

   function getChart() {

        //first json object
        //note: each object Property name must be the same as it is in the Models classes on    server side
        Category = {};
        Category.Name = "Category1";
        Category.Values = [];
        Category.Values[0] = "CategoryValue1";
        Category.Values[1] = "CategoryValue2";

        //second json object
        XAxis = {};
        XAxis.Name = "XAxis1";
        XAxis.Values = [];
        XAxis.Values[0] = "XAxisValue1";
        XAxis.Values[1] = "XAxisValue2";

        //third json object
        YAxis = {};
        YAxis.Name = "YAxis1";

        //convert all three objects to string
        //note: each object name should be the same as the controller parameter is!!
        var StringToPost = JSON.stringify({CategoryObject : Category, XAxisObject : XAxis, YAxisObject : YAxis});

        $.ajax({
            url: "@Url.Action("getChart","SBM")",
            type: 'POST',
            contentType: "application/json",
            dataType: 'html',
            data: StringToPost,
            success: function (data) {
                var imagestring = btoa(data);
                $('#ChartImage').html(data);
            }
        })
    }

Contrôleur MVC

[HttpPost]
public ActionResult getChart(Category CategoryObject, XAxis XAxisObject, YAxis YAxisObject)
{
    //do some stuff with objects here and return something to client
    return PartialView("_Chart");
}

Modèle de catégorie

public class Category
{
    public string Name { get; set; }
    public List<string> Values { get; set; }
}

Modèle XAxis

public class XAxis
{
    public string Name { get; set; }
    public List<string> Values { get; set; }
}

Modèle YAxis

public class YAxis
{
    public string Name { get; set; }
}

J'espère que cela aidera quelqu'un à clarifier la situation!

23
Gašper Sladič

J'ai eu le même problème (paramètre toujours nul), mais ma solution était différente.

Assurez-vous que votre paramètre de méthode ActionResult ne porte pas le même nom que la propriété d'objet JSON. 

Dans cet exemple, j'ai renommé myParam en myNewParam pour le différencier de la propriété MyParam.

Exemple: Cela ne fonctionnera pas:

    var myObj = {
        ID: '0',
        MyParam: $('#mycontrol').val(),
    }; 

    $.ajax({
        type: "POST",
        url: '@Url.Action("MyAction", "MyModel")',
        cache: false,
        data: JSON.stringify(myObj),
        datatype: 'json',
        contentType: "application/json; charset=utf-8",
        success: function (result) {
        }
    })

[HttpPost]
        public ActionResult MyAction(Class1 myParam)

Cela fonctionnera:

    var myObj = {
        ID: '0',
        MyParam: $('#mycontrol').val(),
    }; 

    $.ajax({
        type: "POST",
        url: '@Url.Action("MyAction", "MyModel")',
        cache: false,
        data: JSON.stringify(myObj),
        datatype: 'json',
        contentType: "application/json; charset=utf-8",
        success: function (result) {
        }
    })

[HttpPost]
        public ActionResult MyAction(Class1 myNewParam) -->renamed
3
live-love

Il me semble que vous essayez de transmettre un tableau d'objets:

JSONString3 = { HAxis : [{ Name : "monday" }] };

Quand votre action n'en veut qu'une:

public ActionResult getChart(YAxis HAxis)

Peut-être que tu voulais seulement en passer un?

JSONString3 = { "Name": "monday" };
1
Ant P
JSONString3 = { "Name": "monday" };

Vous devriez l'envoyer au contrôleur en tant que chaîne, utilisez donc JSON.stringify pour convertir. Je ne sais pas comment utiliser votre type ajax.

 $.post('@Url.Action("getChart","SBM")', {yourJson : data:JSON.stringify(JSONString3)} , function(data) {
            if (data.success) {
var imagestring = btoa(data.name);
                $('#ChartImage').attr('src', "data:image/png;base64," + imagestring + "?" + new       Date().getTime());
   }
});

Dans le contrôleur,

    public ActionResult getChart(string yourJson)
        {
         YAxis  yAxis= JsonConvert.DeserializeObject<YAxis>(yourValue);
          //  ....... your code here
          return Json(new{success=true,name=yAxis.Name},JsonRequestBehavior.AllowGet);
        }

** Remarque: JsonConvert est une méthode d'utilisation de Newtonsoft.Json. , veuillez ajouter une référence Newtonsoft.

0
Quan Truong