Asp.net MVC在控制器中反序列化Kendo Grid数据

时间:2015-07-30 10:14:40

标签: jquery json asp.net-mvc kendo-grid kendo-asp.net-mvc

我有一个ASP.NET MVC 4应用程序。 我有一个带有Kendo.Grid的View,我想用ajax(JSON.stringify)在控制器上发送网格数据。

我的问题是我的控制器收到一个字符串列表,我不知道如何反序列化Json数据。

CODE

这是网格行中包含的对象:

public class CourseDto
{
    public string CodCourse { get; set; }
    public string DesCourse { get; set; }
}

这是我视图中网格的定义:

@(Html.Kendo().Grid<CourseDto>()
    .Name("GridCourses")
    .Columns(columns =>
    {
        columns.Bound(c => c.CodCourse);
        columns.Bound(c => c.DesCourse);
    })
    .DataSource(dataSource => dataSource
        .Ajax()
        .ServerOperation(false)
        .Read("GetAllCourses", "ControllerCourses")
    )
)

这是使用jquery对控制器的ajax调用:

function passTheGrid() {
    $.ajax({
        url: "@Url.Action("ShowCourses")",
        type: "POST",
        data: {
            courses : JSON.stringify($("#GridCourses").data("kendoGrid").dataSource.data());
       },
        success: function (response) {
            $("#coursesDiv").html(response);
        }
    });
}

这是控制器:

[HttpPost]
public PartialViewResult ShowCourses(List<string> courses)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    List<string> temp= new List<string>();
    foreach (var singleCourse in courses)
    {
        temp.Add(js.Deserialize<string>(singleCourse));
    }
    ...
    return PartialView("_viewCourses");
}

在我的例子中,我在网格中只有一个cource,当我在控制器上用ajax传递数据时,参数&#34; course&#34;包含这个字符串:

[{"CodCourse":"PRIVSIC0102006","DesCourse":"MULTIMEDIA - PRIVACY AND SECURITY"}]

但是当我尝试反序列化时,我得到了这个错误:

  

键入&#39; System.String&#39;不支持对矩阵进行反序列化

问题

如何正确地反序列化控制器中的JSON数据?

2 个答案:

答案 0 :(得分:1)

我决定更改代码:

调用Ajax

function passTheGrid() {
    var o = kendo.observable({
        myCourses: $("#GridCourses").data("kendoGrid").dataSource.data()
    });
    var courses = JSON.stringify(o);
    $.ajax({
        url: "@Url.Action("ShowCourses")",
        type: "POST",
        data: {
            courses : courses ,
        success: function (response) {
            $("#coursesDiv").html(response);
        }
    });
}

ajax调用传递此数据:

{"myCourses":[{"CodCourse":"PRIVSIC0102006","DesCourse":"MULTIMEDIA - PRIVACY AND SECURITY"}]}

控制器

[HttpPost]
public PartialViewResult ShowCourses(string courses)
{
    var coursesJson = JObject.Parse(courses).SelectToken("myCourses").ToString();

    var coursesList = JsonConvert.DeserializeObject<List<CourseDto>>(coursesJson);
    ...
    return PartialView("_viewCourses");
}

并且课程列表包含对象CourseDto。

答案 1 :(得分:0)

MVC内置的序列化程序应该能够做到这一点,假设您传入的JSON结构与CourseDto的结构匹配。

更新接受Post的控制器方法:

[HttpPost]
public PartialViewResult ShowCourses(List<CourseDto> courses)
{
    foreach (var singleCourse in courses)
    {
        // do something with your courses
    }
    ...
    return PartialView("_viewCourses");
}

此外,更新将数据传递给控制器​​的JS函数,以使myCourses变为courses以匹配您的控制器参数。

function passTheGrid() {
    $.ajax({
        url: "@Url.Action("ShowCourses")",
        type: "POST",
        data: {
            courses : JSON.stringify($("#GridCourses").data("kendoGrid").dataSource.data());
       },
        success: function (response) {
            $("#coursesDiv").html(response);
        }
    });
}