来自Ajax Post的JSON到MVC对象

时间:2017-01-23 04:46:11

标签: c# json ajax asp.net-mvc asp.net-mvc-4

我有这个json array-ish变量,它从表中获取值:

var data = { "Model": [] };
$(".student-grade-data-row").each(function () {
    data.Model.push({
        'subjectId' : currentSubjectId,
        'studentId': $(this).attr('id'),
        'grade1' : $(this).find(".grade-select").val(),
        'mult' : $(this).find(".mult-select").val(),
        'subject': $(this).find(".topic-input").val(),
    });
});

它被设计成类似于名为grade

的MVC类
public partial class grade
{
    public int id { get; set; } //auto-set
    public int subjectId { get; set; }
    public string studentId { get; set; }
    public int grade1 { get; set; }
    public int mult { get; set; }
    public string subject { get; set; }
    public System.DateTime date { get; set; } //auto-set
}

现在,在完美的世界中,我希望将数据变量中的值发送到我的控制器中,如下所示:

$.ajax({
    url: '/Ajax/SendGrades',
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    success: function (dt) {
        console.log(dt);
    }
});

然后我可以把它拿起来,并将其序列化为适当的对象列表。

问题是我甚至无法看到我发送给控制器的真实情况以及如何将其链接到对象。

我尝试让函数采用List<grade> Model类型的agrument,但它会一直告诉我值为null。

我尝试使用一些基本的序列化,但无法使其工作。代码

public ActionResult SendGrades(JsonResult Model)
{
    List<grade> g = new List<grade>();
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(grade));
    g = (List<grade>)serializer.ReadObject(Model);
    return Content("Hi");
}

给我一​​个错误说

  

无法从System.Web.Mvc.JsonResult转换为System.IO.Stream

这样做的正确方法是什么,以便我以后可以安全地将值存储在我的数据库中?

我对这类工作比较陌生,所以我为任何noob-ism道歉。 任何帮助都会很棒。

3 个答案:

答案 0 :(得分:2)

你需要包含ajax选项

type: 'POST'

默认情况下,其GET没有正文,因此设置contentType毫无意义,DefaultModelBinder将不会使用JsonValueProviderGET },数据的格式必须是data: { [0]subjectId: value, [0]studentId: value, [1]subjectId: value, [0]studentId: value, ....etc } - 即索引属性名称)

完整的代码需要

$.ajax({
    url: '/Ajax/SendGrades',
    type: 'POST', // add this
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    success: function (dt) {
        console.log(dt);
    }
});

控制器方法

public ActionResult SendGrades(List<grade> model)

答案 1 :(得分:0)

你可以试试这个。添加一个类包含作为属性的等级列表

class Models
{
    public List<grade> Model{get; set;}
}

并像这样更改你的方法

public ActionResult SendGrades(Models models)
{
    List<grade> g = models.Model;
    //then write your logic here
}

答案 2 :(得分:0)

您的模型应该像

public partial class grade
{
    public int id { get; set; } //auto-set
    public int subjectId { get; set; }
    public string studentId { get; set; }
    public int grade1 { get; set; }
    public int mult { get; set; }
    public string subject { get; set; }
    public System.DateTime date { get; set; } //auto-set
}

当您向服务器发送数据时使用data.Model分配数据,因为您将值设置为模型

$.ajax({
    url: '/Ajax/SendGrades',
    type: "POST",
    data: data.Model, //try to change it in ur code first if not work use jquery.post
    contentType: "application/json; charset=utf-8",
    success: function (dt) {
    console.log(dt);
    }
});

或使用Jquery Post

$.post('/Ajax/SendGrades', data.Model,
       function(data){
        console.log(data);
       });

和控制器

public ActionResult SendGrades(List<grade> Model)
{
      //then write your logic here
}