我有一个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数据?
答案 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);
}
});
}