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。
我有一个 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。