使用表格的表单,将所有值提交给IEnumerable Controller操作

时间:2015-07-23 23:32:10

标签: javascript c# ajax asp.net-mvc-4

我有一个表格,其中列出了表格结构

@model IEnumerable<myType>
@Html.AntiForgeryToken()
@using (Ajax.BeginForm("Save", "NOC", null, ajaxopts, new { @encType = "multipart/form-data", @id = "myform", @name = "myform" }))
{

<table>
<tr>
<td><input type="hidden" name="myType[0].ID" id="myType[0].ID" value="16" /></td>
<td><input type="text" name="myType[0].Name" id="myType[0].Name" value="Jim" /></td>
<td><input type="checkbox" name="myType[0].Selected" id="myType[0].Selected" checked /></td>
</tr>
<tr>
<td><input type="hidden" name="myType[1].ID" id="myType[1].ID" value="17" /></td>
<td><input type="text" name="myType[1].Name" id="myType[1].Name" value="Bob" /></td>
<td><input type="checkbox" name="myType[1].Selected" id="myType[1].Selected" /></td>
</tr>
</table>
<button id="process" value="Save" class="btn btn-primary">Save</button>
}

在Chrome中,我可以在“表单数据”部分看到发布到控制器的数据列表....

myType[0].ID: 16
myType[0].Name: Jim
myType[0].Selected: on
myType[1].ID: 17
myType[1].Name: Bob

但是在控制器中我得到了空

[HttpPost]
public async Task<ActionResult> SaveData(IEnumerable<myType> model)
{
  return Json("Hi");
} 

此外,如果我查看Chrome开发工具的预览,我会在控制器返回的预览中看到“嗨”。

我的Javascript看起来像这样

$("#process").on("click", function (event){
  event.preventDefault();
  var formData = $("#myForm").serialize();
  $.ajax({
    url: url,
    type: "POST",
    data: formData
  })
});

模型是

public class myType
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool Selected { get; set; }
}

没有显示javascript错误,只有控制器没有数据?

任何帮助都会非常感激。

由于

1 个答案:

答案 0 :(得分:0)

您手动生成的html具有与您的模型无关的name属性。要回发到IEnumerable<myType> model,您的元素必须

<input type="hidden" name="[0].ID />
<input type="hidden" name="[1].ID />

等。您还应删除id属性,因为这些属性无效,并且任何尝试使用它们的jquery函数都将失败(例如.(点)将被解释为类标识符。

另请注意,由于checkbox的值不会绑定到on值,因此boolean的使用无效。

根据您的评论,您使用javascript函数生成此html以动态添加新元素。如果是这样,我建议您进行审核this answer。您还应该使用一些对象填充初始模型,并使用for循环生成正确的html(使模型IList<myType>

for(int i = 0; i < Model.Count; i++)
{
  @Html.HiddenFor(m => m.ID)
  @Html.TextBoxFor(m => m.Name)
  @Html.CheckBoxFor(m => m.Selected)
}

然后检查它生成的html。