C# MVC模型绑定在AJAX请求的复杂类型上无法按预期工作
我有一个“ViewModel”要传递给我的操作,它如下所示:C# MVC模型绑定在AJAX请求的复杂类型上无法按预期工作,c#,ajax,asp.net-mvc-4,model-binding,C#,Ajax,Asp.net Mvc 4,Model Binding,我有一个“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;
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; }
}
我打电话:
$.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)
在检查请求时
(我的操作成功命中),将填充另一个编号
,而我的MyClass
集合为null
我错过了一些明显的东西,我只是不知道是什么
编辑
我真的很感谢迄今为止的建议和答案,但是(到目前为止)没有一个有效,所以现在我满足于:
public class RequestViewModel
{
public int[] MyClassIds { get; set; }
public int[] MyNumberValues { get; set; }
public int AnotherNumber { get; set; }
}
这样做感觉很糟糕,但现在这是一个有相当多紧迫性的项目,所以我必须继续工作。尝试使用
JSON。将字符串化并在ajax请求中修改数据,如下所示:
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
尝试使用JSON.stringify
并将ajax请求中的数据修改为:
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
请尝试以下代码,并将其名称与控制器中的名称相同,如下所示:-
$.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
}
});
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
我建议您在操作方法上方尝试POST请求put httpPost属性,如下所示:-
$.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
}
});
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
请尝试以下代码,并将其名称与控制器中的名称相同,如下所示:-
$.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
}
});
[HttpPost]
public ActionResult MyAction(RequestViewModel request)
我建议您在操作方法上方尝试POST请求put httpPost属性,如下所示:-
$.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
}
});
[HttpPost]
public ActionResult MyAction(RequestViewModel 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
}
});
});
公共类MyClass
{
公共int Id{get;set;}
公共整数MyNumber{get;set;}
}
公共类RequestViewModel
{
公共列表MyClass{get;set;}
公共整数另一个数{get;set;}
}
[HttpPost]
公共操作结果保存(RequestViewModel actionRequestX)
{
返回null;
}
var actionRequest={
我的班级:[
{
Id:1,
我的号码:30
},
{
Id:2,
我的号码:40
}
],
另一个号码:12
};
$.ajax({
类型:“POST”,
url:“/Home/Save”,
contentType:“应用程序/json,字符集=utf-8”,
数据:JSON.stringify({actionRequestX:actionRequest}),
数据类型:“json”,
传统的:是的,
成功:功能(数据){
//好东西
},
错误:函数(数据){
//坏东西
}
});
});
我不确定差异在哪里,现在我无法重现错误,但这对我来说是可行的
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
}
});
});
公共类MyClass
{
公共int Id{get;set;}
公共整数MyNumber{get;set;}
}
公共类RequestViewModel
{
公共列表MyClass{get;set;}
公共整数另一个数{get;set;}
}
[HttpPost]
公共操作结果保存(RequestViewModel actionRequestX)
{
返回null;
}
var actionRequest={
我的班级:[
{
Id:1,
我的号码:30
},
{
Id:2,
我的号码:40
}
],
另一个号码:12
};
$.ajax({
类型:“POST”,
url:“/Home/Save”,
contentType:“应用程序/json,字符集=utf-8”,
数据:JSON.stringify({actionRequestX:actionRequest}),
数据类型:“json”,
传统的:是的,
成功:功能(数据){
//好东西
},
错误:函数(数据){
//坏东西
}
});
});
取出数据类型:“json”
吗?您告诉请求您正在发送一个JSON,它是一个字符串,但您正在提供一个对象。要么保留数据类型
规范并对对象进行字符串化,要么删除该规范。@AndreiV-谢谢你的建议,但没有起作用。我的印象是,所有这些都是作为请求的一部分序列化的?嗯。。。那一定是出了什么事。我必须重新检查我的来源。是的,奇怪的是,另一个编号填充了,而列表没有。我认为它是空的,因为路由。把数据类型:“json”
去掉?您告诉请求您正在发送一个JSON,它是一个字符串,但您正在提供一个对象。要么保留数据类型
规范并对对象进行字符串化,要么删除该规范。@AndreiV-谢谢你的建议,但没有起作用。我的印象是,所有这些都是作为请求的一部分序列化的?嗯。。。那一定是出了什么事。我必须重新检查我的来源。是的,奇怪的是,另一个编号
被填充,而列表没有。我认为它是空的,因为路由。还有一些额外的东西@Kartikeya,并且仍然在更新:Pby默认请求是get,控制器操作上不需要httpget属性。。Brooh好的,明白了。顺便说一句,我总是搞不清楚放在哪里,什么时候放帖子。分享一些知识,如果你知道的话,根据上面的答案@KartikeyaAs,不幸的是,整个对象现在是空的。我建议尝试使用POST@DeeMachave以及@Kartikeya来做一些额外的事情,并且仍然在更新:Pby默认请求是get only httpget属性在控制器操作上不是必需的。。broohh好的,明白了。顺便说一句,我总是搞不清楚在哪里放置get和何时放置POST。分享一些知识如果你知道@KartikeyaAs根据上面的答案,整个对象现在不幸为空。我建议尝试使用POST@deemac谢谢你的建议,但是现在整个对象在服务器上为空。@DeeMac…尝试上面的答案非常感谢您的建议,但是现在整个对象在服务器上为空。@DeeMac…尝试上面的答案