asp.net mvc 4-用C#mvc BeginForm发布表单字段数组

本文关键字:表单 数组 字段 布表单 mvc net BeginForm C#mvc asp | 更新日期: 2023-09-27 17:58:04

我有一个.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>

现在我可以选中前两个复选框,然后点击Delete按钮删除所选记录。效果很好。这将调用一个ActionResult,它看起来像这样:

public ActionResult Delete(UserDeleteModel[] users)
{
    // delete records code
}

*但是,*当我导航到数据表网格中的第二页时,我的表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开始计数。这当然有道理。

但是,当我选择一个用户并点击Delete按钮时,我确实看到浏览器张贴了所有输入字段及其值,但ActionResult给了我一个空的UserDeleteModel[] list

UserDeleteModel[] list之所以是NULL,是因为表格网格中的表单字段不会从第二页的0开始计数。它从第二页的5开始。

由于某些原因,.NET必须具有从0开始按顺序向上计数的字段。如果它从任何其他数字开始,则发布的字段不会映射到控制器中的ViewModel。

我确实在Request.Form对象中看到了表单值。但出于某种原因,它没有被绘制出来。

当然,这是一个有问题的bug。有人知道如何解决这个问题吗?

asp.net mvc 4-用C#mvc BeginForm发布表单字段数组

您遇到的问题是ASP.NET MVC如何绑定集合。您发布的是一个非顺序集合(即索引不是以0开头),因此默认的MVC绑定器不知道如何解析。

看看以下答案:

非顺序集合绑定

另一种解决方案是根据您的需要创建自己的活页夹。