MVC模型绑定在AJAX请求的复杂类型上未按预期工作
本文关键字:工作 类型 复杂 绑定 模型 AJAX 请求 MVC | 更新日期: 2023-09-27 18:21:23
我有一个"ViewModel"要传递给我的操作,它看起来像这样:
public class MyClass
{
public int Id { get; set; }
public int MyNumber { get; set; }
}
public class RequestViewModel
{
public List<MyClass> MyClasses { get; set; }
public int AnotherNumber { get; set; }
}
在javascript中,我定义我的数据如下:
var actionRequest = {
MyClasses: [
{
Id: 1,
MyNumber: 30
},
{
Id: 2,
MyNumber: 40,
}
],
AnotherNumber: 12
};
我打电话:
$.ajax({
type: "Get",
url: " /Controller/MyAction",
data: actionRequest,
dataType: "json",
traditional: true,
success: function (data) {
// Good stuff
},
error: function (data) {
// Bad stuff
}
});
我的行动签名:
public ActionResult MyAction(RequestViewModel request)
在检查request
(我的操作成功命中)时,会填充AnotherNumber
,而我的MyClass
集合是null
。
我错过了一些显而易见的东西,我只是不知道是什么。
编辑
我真的很感激到目前为止的建议和答案,但(到目前为止)都没有奏效,所以现在我只能接受:
public class RequestViewModel
{
public int[] MyClassIds { get; set; }
public int[] MyNumberValues { get; set; }
public int AnotherNumber { get; set; }
}
这样做感觉很可怕,但现在这是一个有点紧迫感的项目,所以我必须采取有效的方法。
尝试下面的代码,并将名称与控制器中的名称相同,如下所示:-
$.ajax({
type: "POST",
url: " /Controller/MyAction",
data: :{ request : JSON.stringify(actionRequest) },
dataType: "json",
traditional: true,
success: function (data) {
// Good stuff
},
error: function (data) {
// Bad stuff
}
});
我建议尝试POST请求,将httpPost属性放在操作方法之上,如下所示:-
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
尝试使用JSON.stringify
并在ajax请求中将data
修改为:
data:{ request : JSON.stringify(actionRequest) }
并在ajax请求中添加contentType: "application/json"
。
或者试试这个:
var request = {
MyClasses: [
{
Id: 1,
MyNumber: 30
},
{
Id: 2,
MyNumber: 40,
}
],
AnotherNumber: 12
};
request = JSON.stringify({ 'request': request });
现在以这种方式在ajax请求中使用data
:
data: request
我不确定差异在哪里,现在我无法重现错误,但这对我有效。
public class MyClass
{
public int Id { get; set; }
public int MyNumber { get; set; }
}
public class RequestViewModel
{
public List<MyClass> MyClasses { get; set; }
public int AnotherNumber { get; set; }
}
[HttpPost]
public ActionResult Save(RequestViewModel actionRequestX)
{
return null;
}
var actionRequest = {
MyClasses: [
{
Id: 1,
MyNumber: 30
},
{
Id: 2,
MyNumber: 40
}
],
AnotherNumber: 12
};
$.ajax({
type: "POST",
url: "/Home/Save",
contentType: "application/json, charset=utf-8",
data: JSON.stringify({ actionRequestX: actionRequest }),
dataType: "json",
traditional: true,
success: function (data) {
// Good stuff
},
error: function (data) {
// Bad stuff
}
});
});