我有一个.NET MVC4 Web应用程序,我正在使用jquery数据表来创建一个网格。
该网格可容纳约100个用户,但每页仅显示5个用户。在每个用户名前面我都有一个复选框。我可以从我的网格中选择用户,然后按删除按钮删除这些用户。
我的表是这样构建的(简单地说):
<table class="datatables">
<tbody>
<tr>
<td><input type="checkbox" name="user[0].Delete" /></td>
<td><input type="hidden" name="user[0].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[1].Delete" /></td>
<td><input type="hidden" name="user[1].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[2].Delete" /></td>
<td><input type="hidden" name="user[2].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[3].Delete" /></td>
<td><input type="hidden" name="user[3].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[4].Delete" /></td>
<td><input type="hidden" name="user[4].Username" /></td>
</tr>
</tbody>
</table>
现在我可以选择前两个复选框,然后点击删除按钮删除所选记录。工作正常。这将调用ActionResult
,如下所示:
public ActionResult Delete(UserDeleteModel[] users)
{
// delete records code
}
* 但是,当我导航到datatables网格中的第二页时,我的表HTML将如下所示:
<table class="datatables">
<tbody>
<tr>
<td><input type="checkbox" name="user[5].Delete" /></td>
<td><input type="hidden" name="user[5].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[6].Delete" /></td>
<td><input type="hidden" name="user[6].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[7].Delete" /></td>
<td><input type="hidden" name="user[7].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[8].Delete" /></td>
<td><input type="hidden" name="user[8].Username" /></td>
</tr>
<tr>
<td><input type="checkbox" name="user[9].Delete" /></td>
<td><input type="hidden" name="user[9].Username" /></td>
</tr>
</tbody>
</table>
所以input
字段从5
开始计算。这当然有道理。
但是,当我选择一个用户并点击“删除”按钮时,我确实看到浏览器发送了所有输入字段及其值,但ActionResult
给了我一个空的UserDeleteModel[] list
。
UserDeleteModel[] list
为NULL
的原因是因为表格中的表单字段不会从第2页的0
开始计算。它从第二页的5
开始。
出于某种原因,.NET必须具有从0
开始按顺序向上计数的字段。如果它从任何其他数字开始,则发布的字段不会映射到控制器中的ViewModel。
我确实在Request.Form
对象中看到了表单值。但由于理由,它没有被映射。
这当然是一个有问题的错误。任何人都知道如何解决这个问题?
答案 0 :(得分:3)
您遇到的问题是ASP.NET MVC如何绑定集合。您正在发布非顺序集合(即索引不是从0开始),因此默认的MVC绑定器不知道如何解析。
看看以下答案:
Non-sequential collection binding
其他解决方案是根据您的需要创建自己的活页夹。