Asp.net MVC 反序列化 Kendo 控制器中的网格数据

Asp.net MVC deserialize Kendo Grid data in the controller

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

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

代码

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

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

在我的示例中,我在网格中只有一个源,当我在控制器上使用 ajax 传递数据时,参数 "courses" 包含此字符串:

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

但是当我尝试反序列化时出现此错误:

Type 'System.String' is not supported for deserialization of a matrix

问题

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

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

我决定更改代码:

致电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。