web-dev-qa-db-ja.com

jsonをコントローラーに送信するときにASP.NET mvc 4コントローラーパラメーターが常にnullになるのはなぜですか?

すでにいくつかの同様の投稿があり、提案されたすべての解決策を試しましたが、それでも機能しません...コントローラー内で値を取得できません。常にnullです。以下はコードです。何か不足していますか?

クライアント側のJavaScript

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

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

モデル

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

指示と解決策をありがとうございました。解決策はあなたの提案のすべての組み合わせなので、1つの投稿にまとめることにしました。

この問題の解決策は次のとおりです。

  1. contentTypeは_application/json_である必要があります(Ant Pが上記で提案したとおり)
  2. jsonデータは_JSONString3 = {"Name" : "monday" }_の形式である必要があります(Ant Pが上記で提案したとおり)
  3. コントローラに送信する前に、jsonは次のようにstringifyedである必要があります:JSONString3 = JSON.stringify(JSONString3)(Quanが提案したとおり)

クライアント側のJavaScript

_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;
    }
_

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

モデル

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

これの代わりに:

_JSONString3 = { "Name" : "monday" };
_

できるよ:

_var JSONString3 = {};
JSONString.Name = "monday";
_

しかし、コントローラーに投稿する前に、オブジェクトを文字列化する必要があります!!!

複数のオブジェクトをコントローラに渡すには、以下の例をご覧ください

クライアント側のJavaScript

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

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

カテゴリモデル

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

XAxisモデル

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

YAxisモデル

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

それが誰かが全体像を明確にするのに役立つことを願っています!

23
Gašper Sladič

同じ問題(パラメーターは常にnull)がありましたが、解決策は異なりました。

ActionResultメソッドパラメータの名前がJSONオブジェクトプロパティと同じでないことを確認してください。

この例では、MyParamプロパティと区別するために、myParamの名前をmyNewParamに変更しました。

例:これは機能しません:

    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)

これは動作します:

    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

オブジェクトの配列を渡そうとしているように見えます:

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

アクションが1つだけ必要な場合:

public ActionResult getChart(YAxis HAxis)

たぶん、あなたは1つだけを渡すつもりでしたか?

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

あなたはそれを文字列としてコントローラに投稿する必要があるので、JSON.stringifyを使用して変換します。私はあなたのajaxタイプの使い方を知りません、$。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());
   }
});

コントローラでは、

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

**注:JsonConvertはNewtonsoft.Jsonを使用する方法です。 、Newtonsoftリファレンスを追加してください。

1
Quan Truong