【问题标题】:Posting array of form fields with C# MVC BeginForm使用 C# MVC BeginForm 发布表单字段数组
【发布时间】:2014-04-11 13:14:25
【问题描述】:

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

*但是,* 当我导航到数据表网格中的第二页时,我的表格 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 是因为表格网格中的表单域不是从第二页的0 开始计数的。它从第二页的5 开始。

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

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

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

【问题讨论】:

  • 如果您使用的是 jquery 数据表方式,为什么您可以简单地删除脚本本身中的选定项目。
  • 您是否尝试过在控制器操作中初始化数组,然后使用TryUpdateModel
  • @AdrianWragg 刚刚尝试过,但没有运气。是这样的吗:list = new UserDeleteModel[5];TryUpdateModel(list);。甚至:TryUpdateModel(Request.Form)。我可以看到值在Request.Form 中。它只是没有映射事物..
  • @Vivendi 试试[10],以防它只会填充索引 5 到 9?您可能还需要尝试TryUpdateModel(list, "user");
  • @AdrianWragg 按照您的建议尝试。不幸的是没有运气。所有键都保留在数组中的null

标签: c# asp.net-mvc-4 datatables jquery-datatables


【解决方案1】:

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

看看下面的答案:

Non-sequential collection binding

其他解决方案是根据您的需要创建自己的活页夹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多