我有一个视图,为IList<T>
吐出一张表,其中T
是这样的:
public class ModelType
{
public int EntityId { get; set; }
public string Description { get; set; }
public bool RequiresComment { get; set; }
}
Razor代码(为简洁而截断):
@model IList<ModelType>
<table id="theTable">
<thead>
<tr>
<th>Description</th>
<th>Requires Comment</th>
</tr>
</thead>
<tbody>
@for(var i = 0;i < Model.Count;i++)
{
<tr>
@Html.HiddenFor(m => m[i].EntityId)
<td>
@Html.TextBoxFor(m => m[i].Description)
</td>
<td>
@Html.CheckBoxFor(m => m[i].RequiresComment)
</td>
</tr>
}
</tbody>
</table>
<input type="button" id="addRowButton" value="Add Row" />
<input type="submit" value="Save" />
然后,我有一些jQuery来处理“添加行”点击事件:
$("#addRowButton").click(function(){
var index = $("#theTable tbody tr").length;
var newRow = '<tr><input type="hidden" name="[' + index + '].EntityId" value="0" />' +
'<td><input type="text" name="[' + index + '].Description" style="width: 98%" /></td>' +
'<td style="text-align: center;"><input type="checkbox" name="[' + index + '].RequiresComment" />' +
'<input name="[' + index + '].RequiresComment" type="hidden" value="false" /></td></tr>';
$("#theTable tbody tr:last").after(newRow);
});
表格行被完美地添加,当我放弃POST时,一切看起来都很好(据我所知)。但由于某些原因,如果添加了一个新行并且在新添加的行上检查了“RequiresComment”字段,则模型绑定器仍然会以RequiresComment
值false
出现。
在每个人都引用Phil Haack's famous collection model binding post之前或者指出我在谈论模型绑定动态生成的HTML元素的其他问题时,让我说我已经成功地使用其他类型的<input />
元素做了几次。这只是checkbox
似乎不起作用。我已经尝试在元素中添加一个ID,因为Fiddler为从第一个视图调用加载的每个已发布字段添加了<input type="hidden" name="[index].RequiresComment" value="false" />
,但我无法获得实际检查到的新行通过true
到模型绑定器。我做错了什么?
答案 0 :(得分:1)
您生成的复选框缺少value
参数,在您的情况下应将其设置为true
。
据我记忆,提交时只提交选中的复选框值。因此,MVC始终创建一个隐藏字段以确保未经检查的复选框的值始终提交。虽然复选框通常用于布尔值,但该值也可以是文本或数字。