Javascript 将对象列表从客户端映射到服务器

Javascript 将对象列表从客户端映射到服务器,javascript,c#,asp.net-mvc,Javascript,C#,Asp.net Mvc,我想使用MVC将对象列表从客户端映射到服务器。在服务器上,我看到列表中填充了正确数量的项,但属性为空。我做错了什么 以下是来自客户端的代码: var listCAORAS = []; $('span.chkDelete input[type=checkbox]:checked').each(function (i, obj) { var iORAS_KEY = $(obj).parent().attr('data-ioras_key'); if

我想使用MVC将对象列表从客户端映射到服务器。在服务器上,我看到列表中填充了正确数量的项,但属性为空。我做错了什么

以下是来自客户端的代码:

var listCAORAS = [];

    $('span.chkDelete input[type=checkbox]:checked').each(function (i, obj) {
          var iORAS_KEY = $(obj).parent().attr('data-ioras_key');
          if (iORAS_KEY) {
            listCAORAS.push({ "iORAS_KEY": Number(iORAS_KEY) });
          }
        });

    $.ajax({
          method: 'post',
          url: '/OrderSupplier/DeleteCAORAS/',
          data: {
            listCAORAS: listCAORAS
          }          
        });
服务器端:

public JsonResult DeleteCAORAS(List<DTO_CAORAS> listCAORAS)
{
}

public class DTO_CAORAS
{
  public int? iORAS_KEY { get; set; }

//many more properties here
}

public JsonResult DeleteCAORAS(列出列表)
{
}
公共级DTO_CAORAS
{
公共内部密钥{get;set;}
//这里还有很多房产
}

默认jQuery ajax
contentType
'application/x-www-form-urlencoded;charset=UTF-8'
这意味着为了绑定到您的模型,您的数据格式需要

$.ajax({
    ....
    data: { [0].iORAS_KEY: 1, [1].iORAS_KEY: 1, [2].iORAS_KEY: 1, ... }
});
i、 e您的对象名称需要具有从零开始的连续集合索引器

请注意,如果正确生成了视图(即,您的复选框绑定到
bool
属性,并且您对
iORAS\u键
属性有一个隐藏的输入),那么您只需要

$.ajax({
    ....
    data $(yourForm).serialize()
});
要在执行此操作时发送复杂对象数组,必须将
contentType
设置为“json”,并对数据进行字符串化,以指示
DefaultModelBinder
使用
JsonValueProviderFactory
将数据反序列化到模型中

$.ajax({
    url: '@Url.Action("DeleteCAORAS", "OrderSupplier")', // always use Url.Action() to generate the url
    ....
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ listCAORAS: listCAORAS })
});

默认的jQuery ajax
contentType
'application/x-www-form-urlencoded;charset=UTF-8'
这意味着为了绑定到您的模型,您的数据格式需要

$.ajax({
    ....
    data: { [0].iORAS_KEY: 1, [1].iORAS_KEY: 1, [2].iORAS_KEY: 1, ... }
});
i、 e您的对象名称需要具有从零开始的连续集合索引器

请注意,如果正确生成了视图(即,您的复选框绑定到
bool
属性,并且您对
iORAS\u键
属性有一个隐藏的输入),那么您只需要

$.ajax({
    ....
    data $(yourForm).serialize()
});
要在执行此操作时发送复杂对象数组,必须将
contentType
设置为“json”,并对数据进行字符串化,以指示
DefaultModelBinder
使用
JsonValueProviderFactory
将数据反序列化到模型中

$.ajax({
    url: '@Url.Action("DeleteCAORAS", "OrderSupplier")', // always use Url.Action() to generate the url
    ....
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ listCAORAS: listCAORAS })
});


你能试着用[FromBody]运行它吗?工作起来很有意义,因为您当前没有通过querystring传递它,但是可以从body添加代码示例吗?
public JsonResult DeleteCAORAS([FromBody]List listCAORAS)
您的javascript代码似乎没有创建任何其他属性,除了您的键,那么,为什么服务器上的对象应该有所不同呢?@BrunoMiquelin FromBody只适用于简单类型。像这样的复杂类型会自动在主体中传递。阅读文档。您可以尝试使用[FromBody]运行它吗?工作起来很有意义,因为您当前没有通过querystring传递它,但是可以从body添加代码示例吗?
public JsonResult DeleteCAORAS([FromBody]List listCAORAS)
您的javascript代码似乎没有创建任何其他属性,除了您的键,那么,为什么服务器上的对象应该有所不同呢?@BrunoMiquelin FromBody只适用于简单类型。像这样的复杂类型会自动在主体中传递。阅读文档。我已经尝试了您的解决方案,但是服务器端的listCAORAS是空的。我甚至尝试过:data:JSON.stringify(listCAORAS),但没有区别。探索来自客户端的调用看起来是这样的:[{“iORAS_键”:“180004590”},{“iORAS_键”:“180004591”},{“iORAS_键”:“180004592”}],这在我看来是完全正确的。如何在javascript中使用“@Url.Action”?我收到一个错误,javascript无法识别@Url.Action。根据您显示的代码,数据可以正确绑定(并且
data:JSON.stringify(listCAORAS),
也可以工作)。我无法马上想到代码中还有什么可能导致它失败(但我很快会做一个测试项目)。至于
@Url.Action()
-脚本是否在外部文件中?(razor代码不在外部文件中解析)是的,它是外部文件。好的,在这种情况下,您需要在主视图中生成url(常见的解决方案是在处理的元素中使用
数据url=“@url.Action(…)”
属性,然后在脚本中(例如)
$(someButton)。单击(函数(){var url=$(this)。数据('url');$.ajax({url:url,.});})
我尝试过你的解决方案,但是服务器端的listCAORAS是空的。我甚至尝试过这样的方法:data:JSON.stringify(listCAORAS),但没有区别。探索来自客户端的调用看起来像这样:[{“iORAS_键”:“180004590”},{“iORAS_键”:“180004591”},{“iORAS_键”:“180004592”}],我觉得很好。您如何在javascript中使用“@Url.Action”?我收到一个错误,javascript无法识别@Url.Action。数据很好,可以正确绑定(并且
data:JSON.stringify(listCAORAS),
也可以工作)基于您所展示的代码。我无法立即想到您的代码中还有什么可能导致它失败(但我很快会做一个测试项目)。至于
@Url.Action()
-脚本是否在外部文件中?(razor代码不在外部文件中解析)是的,它是外部文件。好的,在这种情况下,您需要在主视图中生成url(常见的解决方案是在处理的元素中使用
数据url=“@url.Action(…)”
属性,然后在脚本中(例如)
$(someButton)。单击(函数(){var url=$(this.data('url');$.ajax({url:url,…);})