Javascript 将表单数据作为对象数组发送到asp.net mvc中的控制器
我有一个视图,可以使用razor动态呈现复选框项。用户可以进行调整,然后我需要将表单发送回控制器。如果我只发送一个项目,即行,它工作正常,但如果我尝试发送所有项目,我总是得到空值。如何正确收集表单数据。这就是我现在拥有的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 {
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",
});