【发布时间】:2015-08-07 11:22:53
【问题描述】:
我有一个这样的表格。
<form id="myForm">
<div>
<ul>
<li>
@Html.DropDownListFor(m => m.SelectedVal, new SelectList(Model.ValLst, "Value", "Name"))
</li>
<li>
@Html.TextBoxFor(m => m.Id)
</li>
<li>
@Html.CheckBoxFor(m => m.IsPaid, new { @Id = "IsPaid"})
</li>
</ul>
</div>
</form>
我必须按如下方式序列化此表单,并且我正在对序列化数组进行操作
values = $('#myForm').serializeArray();
0: Object
name: "SelectedVal"
value: "BMV"
1: Object
name: "Id"
value: "123"
2: Object
name: "IsPaid"
value: "true"
3: Object
name: "IsPaid"
value: "false"
我遇到了 CheckBoxFor 助手的问题。因为,它正在创建一个值为 false 的隐藏字段,并且隐藏字段和复选框都具有相同的 id。所以复选框的模型值总是假的,即使它被选中。即在对序列化数组进行操作时,隐藏字段值会覆盖复选框值。
所以我想在序列化时忽略隐藏字段。喜欢:
values = $('#myForm').find("input[type != 'hidden']").serializeArray();
0: Object
name: "Id"
value: "123"
1: Object
name: "IsPaid"
value: "true"
但是,它不起作用,因为我没有得到下拉值。所以,想了想,DropDownListFor 也使用了隐藏字段。任何建议,如何将复选框的正确值发送到控制器。诸如忽略复选框或任何其他 html 帮助器之后的立即隐藏字段或强制在复选框之前呈现隐藏字段。
【问题讨论】:
-
使用
.serialize()(不是.serializeArray())。如果您的控制器方法有一个参数是视图中使用的模型,那么您的模型将被正确绑定(并且DropDownListFor()不会生成隐藏字段,并且与复选框关联的隐藏输入没有id!) -
我需要遍历序列化的表单并对其进行操作。所以要使用 each() 我正在使用序列化数组。
-
也许你应该展示你的代码:)
-
您的编辑没有显示您的脚本。
-
我的意思是显示你在哪里执行
$.each()的脚本 :) 并且DropDownListFor()不会生成<input>- 它会生成<select>并且它不是隐藏的(尽管如果你使用一个 jquery 插件,插件可能会隐藏它)。正确的选择器是find('input, select').not(':hidden')但这不会解决您的问题(尽管您可能会想)
标签: jquery asp.net-mvc asp.net-mvc-5 html-helper