使用ajax和Razor页面进行复杂的模型绑定

时间:2019-02-05 11:39:26

标签: c# jquery ajax model-view-controller

具有复杂类型的模型绑定不是绑定,我已经经历了很多堆栈溢出的帖子,但是都没有解决我的问题。

我有一个有效的示例,其中我直接传递了对象的集合,但是我需要指定[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;}
}

1 个答案:

答案 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

我认为您不需要其他包装纸。