具有复杂类型的模型绑定不是绑定,我已经经历了很多堆栈溢出的帖子,但是都没有解决我的问题。
我有一个有效的示例,其中我直接传递了对象的集合,但是我需要指定[FromBody]
。
如果我通过一个带有集合的复杂对象,则该集合返回为null,我向MyObj
添加了几个属性,除people集合外,其他所有东西都绑定了。
看起来很奇怪。
MVC
public async Task<IActionResult> OnPostAsync([FromBody] List<Person>
people){}
JAVASCRIPT
$.ajax({
url: '@Url.Page("People")',
data: JSON.stringify(people),
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: "post",
beforeSend: function(xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
}
});
不起作用
MVC
public async Task<IActionResult> OnPostAsync(MyObj contract){}
JAVASCRIPT
var complexObject = {
People: people,
};
var obj = { contract: complexObject };
var data2send = JSON.stringify(obj);
$.ajax({
url: '@Url.Page("People")',
data: data2send,
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: "post",
beforeSend: function(xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
}
});
example of what's data2send contains : "{"contract":{"People":[{"name": "bob"}}"
C#
public class MyObj
{
public List<Person> People {get; set;}
}
答案 0 :(得分:0)
在第二个示例中,您似乎将JSON封装在两个对象中,而不是一个。
我会假设
{"contract":{"People":[{"name": "bob"}}
您的意思是
{"contract":{"People":[{"name": "bob"}]}}
因为第一个版本不完整/无效。
无论如何,它包含一个(未命名的)对象,该对象包含另一个名为“ contract”的对象,然后该对象包含另一个名为“ People”的属性。但是,您的C#MyObj
类不包含contract
抽象,这只是您在action方法中为参数赋予的名称。我敢肯定,您实际上并没有在JSON中发送该消息,因为模型绑定程序试图获取您发送的JSON并将其转换为MyObj
的实例,并且显然该结构与您的JSON。
我希望发送这样的对象会更成功:
{ "People":[{"name": "bob"}]}
要做到这一点,JavaScript应该是
var complexObject = {
People: people,
};
//...
$.ajax({
url: '@Url.Page("People")',
data: complexObject,
//...etc
我认为您不需要其他包装纸。