Javascript 将表单数据作为对象数组发送到asp.net mvc中的控制器

Javascript 将表单数据作为对象数组发送到asp.net mvc中的控制器,javascript,jquery,json,ajax,asp.net-mvc,Javascript,Jquery,Json,Ajax,Asp.net Mvc,我有一个视图,可以使用razor动态呈现复选框项。用户可以进行调整,然后我需要将表单发送回控制器。如果我只发送一个项目,即行,它工作正常,但如果我尝试发送所有项目,我总是得到空值。如何正确收集表单数据。这就是我现在拥有的 public void SendData(List<SomeClass> myData) { var data = myData; //always null } public class SomeClass {

我有一个视图,可以使用razor动态呈现复选框项。用户可以进行调整,然后我需要将表单发送回控制器。如果我只发送一个项目,即行,它工作正常,但如果我尝试发送所有项目,我总是得到空值。如何正确收集表单数据。这就是我现在拥有的

public void SendData(List<SomeClass> myData)
    {
        var data = myData; //always null
    }

    public class SomeClass
    {
        public int Id { get; set; }
        public int RoleId { get; set; }
        public bool R { get; set; }
        public bool W { get; set; }
        public bool E { get; set; }
        public bool D { get; set; }
    }
收集这样的数据(在此处发现类似问题):

编辑3

使用only.serialize()时,我将null作为控制器上的输入参数,使用JSON.stringify时,我将get Count=0,也为空。我错过了什么

HTML:

@型号列表
@for(int i=0;im[i].Id)
@Html.HiddenFor(m=>m[i].RoleId)
@Html.CheckBoxFor(m=>m[i].R)
@Html.CheckBoxFor(m=>m[i].W)
@Html.CheckBoxFor(m=>m[i].E)
@Html.CheckBoxFor(m=>m[i].D)
}
发送
$('#send')。在('click',函数(){
var data=$(“#myForm”).serialize();
控制台日志(数据);
//data=JSON.stringify({'ajaxData':data});
$.ajax({
contentType:'application/json;charset=utf-8',
数据类型:“json”,
键入:“POST”,
url:“/Home/SendData”,
数据:数据,
成功:函数(){
},
故障:功能(响应){
}
});
});
控制器

public void SendData(IEnumerable<SomeClass> ajaxData)
    {
        var data = ajaxData;
    }
public void SendData(IEnumerable ajaxData)
{
var数据=ajaxData;
}

我花了一些时间来理解这个问题(-:

无论如何,我已经创建了一个小测试,它正在工作

public class User
{
        public string UserName { get; set; }
}

public void TestPost(List<User> users)
{

}

您尚未显示如何动态生成表单控件,但显示的html具有
name
属性,没有索引器,因此不会绑定到集合。请参考答案和一些选项,遗憾的是,向名称添加索引不起作用(在注释的第一个和第二个链接后面)当然,它是有效的。如果它不适用于你,那么考虑一下你已经使用的代码,这样我们就可以纠正你的错误。你不能使用<代码>前缀< /Cor>循环来生成一个视图中的表单控件。你需要使用<代码>(int i=0;i模型,计数;i++){@ html。HiddenFor(m= > m ID)@ html。CheckBoxFor(m->m[i]。r)…}以便正确命名控件。是的,当您返回到具有模型参数的方法(即
列出模型
)时,
DefaultModelBinder
将正确设置所有
布尔
属性的值!感谢您的回答@Avi Fatal它让我走了这么远(请参见编辑2)。我现在面临的问题是。razor呈现的复选框元素有两个输入,一个是隐藏的,另一个是显示的。当我收集表单数据时,我总是得到最后一个输入值(隐藏的,这总是错误的)我怎样才能得到真正的价值?嗨,请接受答案并打开另一个线程,这是一个不同的问题。它不属于这里…当你打开一个新线程时,我会查看它。我有,它在这里
{"ajaxData":[{"Id":"1","RoleId":"1","R":"false","W":"false","E":"false","D":"false"},{"Id":"2","RoleId":"2","R":"false","W":"false","E":"false","D":"false"}]}
var ajaxData = $('.control_group').map(function (i, group) {
                var data = {};
                $(group).find(':input').each(function () {
                    data[this.name] = this.value;
                });
                return data;
            }).get();

            ajaxData = JSON.stringify({ 'ajaxData': ajaxData });

            console.log(ajaxData);
        @model List<WebApplication3.Controllers.HomeController.SomeClass>

    <form id="myForm">
        @for (int i = 0; i < Model.Count; i++)
        {
            <div>Element</div>
            @Html.HiddenFor(m => m[i].Id)
            @Html.HiddenFor(m => m[i].RoleId)
            @Html.CheckBoxFor(m => m[i].R)
            @Html.CheckBoxFor(m => m[i].W)
            @Html.CheckBoxFor(m => m[i].E)
            @Html.CheckBoxFor(m => m[i].D)
        }
    </form>

    <button id="send">SEND</button>


    <script type="text/javascript">

        $('#send').on('click', function () {

            var data = $("#myForm").serialize();
            console.log(data);

            //data = JSON.stringify({ 'ajaxData': data });

            $.ajax({
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                type: 'POST',
                url: '/Home/SendData',
                data: data,
                success: function () {

                },
                failure: function (response) {

                }
            });

        });

    </script>
public void SendData(IEnumerable<SomeClass> ajaxData)
    {
        var data = ajaxData;
    }
public class User
{
        public string UserName { get; set; }
}

public void TestPost(List<User> users)
{

}
$.ajax({
            contentType: 'application/json; charset=utf-8',
            type: 'POST',
            url: '/Home/TestPost',
            data: JSON.stringify([{ 'UserName': "user 1" }, { 'UserName': "user 2" }]),
            dataType: "json",
        });