AJAX POST ASP.NET Core 2.2 中的请求不将数据传递给控制器方法
AJAX POST Request Not Passing Data to Controller Method in ASP.NET Core 2.2
在开始之前,我想说 - 我意识到这个问题与本网站上 post 编辑和回答的许多其他问题非常相似。我已通读并尝试了尽可能多的与我的问题相关的解决方案,并且 none 到目前为止有效。
我正在尝试将数据从我的网页传递到控制器方法。网页非常简单,只需要捕获用户输入的信息并发送出去。我正在使用 Telerik 的 Kendo 网格来绑定和组织我的数据。但是,无论我尝试什么,我的 AJAX post 请求都无法正确传递参数。使用浏览器的调试器时,我可以看到传递给 AJAX 请求的参数是有效的,但是当它们在控制器方法中遇到我的断点时,它们都为 null 或默认值。
函数包含 AJAX 请求
function saveShiftDataToServer() {
var grid = $("#myGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var allData = dataSource.data();
var comments = '@Model.Comments';
var loadInfoCorrect = '@Model.LoadInfoCorrect';
$.ajax({
type: "POST",
url: '/Home/SaveData',
data: JSON.stringify({ accessorials: allData, comments: comments, loadInfoCorrect: loadInfoCorrect }),
contentType: "application/json; charset=utf-8",
datatype: "json"
})
}
控制器方法
[AcceptVerbs("Post")]
public ActionResult SaveData(Accessorial[] accessorials, string comments, bool loadInfoCorrect)
{
// Code removed for brevity
}
我的 Kendo 网格类型为辅助(第一个控制器方法参数类型),所以我的假设是检索所有当前行的集合应该 return 该模型的数组。即便如此,"comments" 是一个字符串,但只会作为 null 传递给控制器方法。
我是 ASP.NET Core 和 Kendo 的新手,所以我确信我遗漏了一些明显的东西。如有任何帮助,我们将不胜感激!
您正在传递 JSON
对应于 C#
的对象,如下所示:
public class Model {
public Accessorial[] Accessorials { get; set; }
public string Comments { get; set; }
public bool loadInfoCorrect { get; set; }
}
尝试在上面声明这样的 class 并以这种方式调整您的操作方法:
public ActionResult SaveData(Model model)
{
// Code removed for brevity
}
如果没有帮助 - 创建模型参数 object
并在调试模式下检查您从 AJAX
调用中获得的内容。
您可以在 ViewModel 中传递所有数据并使用 [FromBody]
on action
访问它
public class ViewModel
{
public List<Accessorial> Accessorials{ get; set; }
public string Comments { get; set; }
public bool LoadInfoCorrect { get; set; }
}
Ajax:
var model = {};//pass all you data to an object
model.Accessorials = allData ;
model.comments = comments ;
model.loadInfoCorrect = loadInfoCorrect;
var items = JSON.stringify(model);
$.ajax({
url: '/GetAllCustDetails/SaveData',
type: "POST",
data: items,
contentType: 'application/json; charset=utf-8',
//dataType: "json",
success: function (response) {
alert("111");
}
});
控制器:
[HttpPost]
public ActionResult SaveData([FromBody]ViewModel model)
感谢所有回复!通过将 AJAX 数据类型更改为 "text" 并直接将 JSON 直接传递给反序列化服务器端,我最终能够在我的控制器中看到有效数据。出于某种原因,这是迄今为止我能够完成这项工作的唯一方法。
AJAX POST 调用
function saveShiftDataToServer() {
var grid = $("#accessorialGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var allData = dataSource.data();
var shiftOverview = {
ShiftId: 0,
UserName: "test",
ShiftDate: null,
LoadList: null,
AccessorialList: allData,
LoadInfoCorrect: true,
Comments: ""
};
var jsonData = JSON.stringify(shiftOverview);
$.ajax({
type: "POST",
url: '/Home/SaveData',
data: { json: jsonData },
datatype: "text",
success: function (response) {
alert("111");
}
})
}
控制器方法
[AcceptVerbs("Post")]
public ActionResult SaveData(string json)
{
JsonConvert.DeserializeObject<ShiftOverview>(json); // This produces an object with valid data!
}
您只需在操作方法中使用 [FromBody] 属性,如下所示:
[HttpPost]
public ActionResult SaveData([FromBody]Model model)
{
// Code removed for brevity
}
在开始之前,我想说 - 我意识到这个问题与本网站上 post 编辑和回答的许多其他问题非常相似。我已通读并尝试了尽可能多的与我的问题相关的解决方案,并且 none 到目前为止有效。
我正在尝试将数据从我的网页传递到控制器方法。网页非常简单,只需要捕获用户输入的信息并发送出去。我正在使用 Telerik 的 Kendo 网格来绑定和组织我的数据。但是,无论我尝试什么,我的 AJAX post 请求都无法正确传递参数。使用浏览器的调试器时,我可以看到传递给 AJAX 请求的参数是有效的,但是当它们在控制器方法中遇到我的断点时,它们都为 null 或默认值。
函数包含 AJAX 请求
function saveShiftDataToServer() {
var grid = $("#myGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var allData = dataSource.data();
var comments = '@Model.Comments';
var loadInfoCorrect = '@Model.LoadInfoCorrect';
$.ajax({
type: "POST",
url: '/Home/SaveData',
data: JSON.stringify({ accessorials: allData, comments: comments, loadInfoCorrect: loadInfoCorrect }),
contentType: "application/json; charset=utf-8",
datatype: "json"
})
}
控制器方法
[AcceptVerbs("Post")]
public ActionResult SaveData(Accessorial[] accessorials, string comments, bool loadInfoCorrect)
{
// Code removed for brevity
}
我的 Kendo 网格类型为辅助(第一个控制器方法参数类型),所以我的假设是检索所有当前行的集合应该 return 该模型的数组。即便如此,"comments" 是一个字符串,但只会作为 null 传递给控制器方法。
我是 ASP.NET Core 和 Kendo 的新手,所以我确信我遗漏了一些明显的东西。如有任何帮助,我们将不胜感激!
您正在传递 JSON
对应于 C#
的对象,如下所示:
public class Model {
public Accessorial[] Accessorials { get; set; }
public string Comments { get; set; }
public bool loadInfoCorrect { get; set; }
}
尝试在上面声明这样的 class 并以这种方式调整您的操作方法:
public ActionResult SaveData(Model model)
{
// Code removed for brevity
}
如果没有帮助 - 创建模型参数 object
并在调试模式下检查您从 AJAX
调用中获得的内容。
您可以在 ViewModel 中传递所有数据并使用 [FromBody]
on action
public class ViewModel
{
public List<Accessorial> Accessorials{ get; set; }
public string Comments { get; set; }
public bool LoadInfoCorrect { get; set; }
}
Ajax:
var model = {};//pass all you data to an object
model.Accessorials = allData ;
model.comments = comments ;
model.loadInfoCorrect = loadInfoCorrect;
var items = JSON.stringify(model);
$.ajax({
url: '/GetAllCustDetails/SaveData',
type: "POST",
data: items,
contentType: 'application/json; charset=utf-8',
//dataType: "json",
success: function (response) {
alert("111");
}
});
控制器:
[HttpPost]
public ActionResult SaveData([FromBody]ViewModel model)
感谢所有回复!通过将 AJAX 数据类型更改为 "text" 并直接将 JSON 直接传递给反序列化服务器端,我最终能够在我的控制器中看到有效数据。出于某种原因,这是迄今为止我能够完成这项工作的唯一方法。
AJAX POST 调用
function saveShiftDataToServer() {
var grid = $("#accessorialGrid").data("kendoGrid");
var dataSource = grid.dataSource;
var allData = dataSource.data();
var shiftOverview = {
ShiftId: 0,
UserName: "test",
ShiftDate: null,
LoadList: null,
AccessorialList: allData,
LoadInfoCorrect: true,
Comments: ""
};
var jsonData = JSON.stringify(shiftOverview);
$.ajax({
type: "POST",
url: '/Home/SaveData',
data: { json: jsonData },
datatype: "text",
success: function (response) {
alert("111");
}
})
}
控制器方法
[AcceptVerbs("Post")]
public ActionResult SaveData(string json)
{
JsonConvert.DeserializeObject<ShiftOverview>(json); // This produces an object with valid data!
}
您只需在操作方法中使用 [FromBody] 属性,如下所示:
[HttpPost]
public ActionResult SaveData([FromBody]Model model)
{
// Code removed for brevity
}