Domanda Il parametro del controller ASP.NET mvc 4 è sempre nullo quando si invia json al controller, perché?


Ci sono alcuni post simili già qui, e ho provato ogni soluzione suggerita, e ancora non funziona ... Non riesco a ottenere valore all'interno del controller, è sempre nullo. Di seguito è riportato il codice. Mi sto perdendo qualcosa?

Javascript lato 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;
    }

Controller 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");
    }

Modello

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

14
2017-12-04 19:32


origine


risposte:


Grazie ragazzi per le indicazioni e le soluzioni. La soluzione è una combinazione di tutti i tuoi suggerimenti, quindi ho deciso di completarlo in un unico post.

La soluzione al problema è la seguente:

  1. contentType dovrebbe essere application/json (come suggerito da Ant P sopra)
  2. i dati JSON dovrebbero essere in forma di JSONString3 = {"Name" : "monday" } (come suggerito da Ant P sopra)
  3. prima di inviare al controller, JSON dovrebbe essere stringifyed come segue: JSONString3 = JSON.stringify(JSONString3) (come suggerito da Quan)

Javascript lato 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;
    }

Controller 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");
}

Modello

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

Invece di questo:

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

possiamo farcela:

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

Ma dobbiamo ancora stringificare l'oggetto prima di postare sul controller !!!

Per passare più oggetti al controller, di seguito è riportato l'esempio


23
2017-12-05 08:34



Ho avuto lo stesso problema (parametro sempre nullo), ma la mia soluzione era diversa.

Assicurati che il parametro del metodo ActionResult non abbia lo stesso nome della proprietà dell'oggetto JSON.

In questo esempio ho rinominato myParam in myNewParam per differenziare la proprietà MyParam.

Esempio: Questo non funzionerà:

    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)

Questo funzionerà:

    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)

2
2017-07-11 14:55



Mi sembra che tu stia cercando di passare una serie di oggetti:

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

Quando la tua azione ne vuole solo una:

public ActionResult getChart(YAxis HAxis)

Forse intendevi solo passarne uno?

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

1
2017-12-04 19:34



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

Dovresti postarlo sul controller come stringa, quindi usa JSON.stringify per convertire, non so come usare il tuo tipo Ajax, so solo usare $ .post ... T_T

 $.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());
   }
});

Nel controller,

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

** Nota: JsonConvert è un metodo per utilizzare Newtonsoft.Json; , aggiungi la referenza Newtonsoft.


0
2017-12-05 05:04



L'aggiunta di un attributo datatype al metodo controller lo ha risolto per me.

[JsonFilter(Param="yourParamName", JsonDataType=typeof(YourParamType))]
[HttpPost]
public ActionResult yourFunction(YourParamType YourParamName)
{
    //do some stuff
}

-1
2018-03-06 16:35