Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C MVC发布表单字段数组_C#_Asp.net Mvc 4_Datatables_Jquery Datatables - Fatal编程技术网

C# 使用C MVC发布表单字段数组

C# 使用C MVC发布表单字段数组,c#,asp.net-mvc-4,datatables,jquery-datatables,C#,Asp.net Mvc 4,Datatables,Jquery Datatables,我有一个.NETMVC4Web应用程序,在其中我使用jquery数据表来创建网格 该网格可容纳约100个用户,但每页仅显示5个用户。在每个用户名前面我都有一个复选框。我可以从我的网格中选择用户,然后按delete按钮删除这些用户 我的表是这样构建的,简单地说: <table class="datatables"> <tbody> <tr> <td><input type="checkbox" n

我有一个.NETMVC4Web应用程序,在其中我使用jquery数据表来创建网格

该网格可容纳约100个用户,但每页仅显示5个用户。在每个用户名前面我都有一个复选框。我可以从我的网格中选择用户,然后按delete按钮删除这些用户

我的表是这样构建的,简单地说:

<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>
*但是,*当我导航到datatables网格中的第二页时,我的表格HTML将如下所示:

public ActionResult Delete(UserDeleteModel[] users)
{
    // delete records code
}
<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>
所以输入字段从5开始计数。这当然有道理

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

UserDeleteModel[]列表为空的原因是表格网格中的表单字段在第二页上没有从0开始计数。从第二页的5开始

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

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


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

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

请看以下答案:


另一种解决方案是根据需要创建自己的绑定器。

如果您使用的是jquery datatable means,那么为什么您可以简单地删除脚本本身中的选定项。您是否尝试过在控制器操作中初始化数组,然后使用TryUpdateModel?@AdrianWragg刚刚尝试过,但运气不佳。它是这样的:list=newuserdeletemodel[5];TryUpdateModellist;。甚至:TryUpdateModelRequest.Form。我可以看到Request.Form中有这些值。它只是不映射事物。@Vivendi尝试[10],以防只填充索引5到9?您可能还需要尝试TryUpdateModellist,user@阿德里安·拉格按照你的建议试过了。不幸的是没有运气。数组中的所有键都保持空。