将mson发送到控制器时,ASP.NET mvc 4控制器参数始终为null,为什么?

时间:2013-12-04 19:32:16

标签: asp.net-mvc json object controller

这里已经有一些类似的帖子,并尝试了所有解决方案,但仍然无效......我无法在控制器内获取值,它始终为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; }
}

5 个答案:

答案 0 :(得分:23)

谢谢你们的指示和解决方案。解决方案是所有建议的组合,所以我决定在一个帖子中进行整理。

问题的解决方案如下:

  1. contentType应该是application/json(如上面提到的Ant P)
  2. json数据应采用JSONString3 = {"Name" : "monday" }的形式(如上面建议的Ant P)
  3. 在发送到控制器之前,json应为stringifyed,如下所示:JSONString3 = JSON.stringify(JSONString3)(如Quan建议的那样)
  4. 客户端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; }
    }
    

    希望它能帮助某人澄清整个画面!

答案 1 :(得分:3)

我有同样的问题(参数总是为null),但我的解决方案不同。

确保您的ActionResult方法参数与JSON对象属性的名称不同。

在这个例子中,我将myParam重命名为myNewParam,以区别于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 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

答案 2 :(得分:1)

在我看来,你正在尝试传递一系列对象:

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

当你的行动只需要一个时:

public ActionResult getChart(YAxis HAxis)

也许你只想通过一个?

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

答案 3 :(得分:0)

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参考。

答案 4 :(得分:-1)

向控制器方法添加数据类型属性为我解决了这个问题。

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