Javascript 将对象列表从客户端映射到服务器
我想使用MVC将对象列表从客户端映射到服务器。在服务器上,我看到列表中填充了正确数量的项,但属性为空。我做错了什么 以下是来自客户端的代码: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
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 ajaxcontentType
是'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,…);})