【问题标题】:Asp.net MVC deserialize Kendo Grid data in the controllerAsp.net MVC 反序列化控制器中的 Kendo Grid 数据
【发布时间】:2015-07-30 10:14:39
【问题描述】:

我有一个 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 传递数据时,参数“课程”包含此字符串:

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

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

矩阵的反序列化不支持类型“System.String”

问题

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

【问题讨论】:

  • 首先将json反序列化为你的模型CourseDto,然后重写CourseDto ToString方法,调用ToString()。
  • @Oğuzhan Soykan 我尝试在我的模型“CourseDto”中直接反序列化,但反序列化给我错误:“CourseDto 不支持矩阵的反序列化。”

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


【解决方案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。

【讨论】:

    【解决方案2】:

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

    将接受 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);
            }
        });
    }
    

    【讨论】:

    • 我试过了,还是不行。参数课程为空。
    • 抱歉,我编辑并更正了我的问题。那是错的。即使我像控制器“courses”的参数一样更改ajax调用“courses”中的参数名称,控制器中的值也始终为空。几分钟前,我在我的问题上发布了答案。我找到了解决办法。
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2014-04-21
    • 2016-06-23
    • 2011-02-26
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多