【问题标题】:ASP.NET MVC BeginCollectionItem issueASP.NET MVC BeginCollectionItem 问题
【发布时间】:2016-01-15 21:47:18
【问题描述】:

我遇到了 HTML 帮助程序 BeginCollectionItem 的问题。它似乎将项目绑定到视图,但没有传播更改。

我有一个局部视图,绑定到它的模型是IEnumerable。下面是一个sn-p。

<tbody>
    @foreach (var entry in Model) {
        <tr>
            @using (Html.BeginCollectionItem("EditedEntries")) {
                <td>@entry.Storeid</td>
                <td>@entry.district</td>
                <td>@Html.EditorFor(x => entry.AdjHrs)</td>
            }
        </tr>
    }
</tbody>

如果我删除foreach 它可以工作,但是我需要使用foreach,因为Ajax 调用将集合连同表及其成员一起返回到部分视图。

【问题讨论】:

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


【解决方案1】:

BeginCollectionItem 设计用于局部视图。为您的模型创建一个(我假设它的名称为MyModel,而您将部分名称命名为"_MyModel.cshtml"

@model MyModel
<tr>
    @using (Html.BeginCollectionItem("EditedEntries"))
    {
        <td>@Html.DisplayFor(m => m.Storeid)</td>
        <td>@Html.DisplayFor(m => m.district)</td>
        <td>@Html.EditorFor(m => m.AdjHrs)</td>
    }
</tr>

然后在您的其他部分中,将 foreach 循环替换为

<tbody>
    @foreach (var entry in Model)
    {
        @Html.Partial("_MyModel", entry)
    }
</tbody>

【讨论】:

  • 是的,我不能这样做,因为在加载和渲染部分列表之前不会填充列表。因此,foreach 处于局部视图中的原因。
  • 您需要再次阅读我的回答。您当前的部分包含一个集合,foreach 循环调用 _MyModel.cshtml 部分
  • 对不起,这已经是漫长的一天,我误读了。感谢您的帮助。
【解决方案2】:

所以我设法找到了问题的原因。 HTML 助手试图变得聪明并自动生成与数据关联的隐藏字段的 ID 和名称。

生成了什么

<tr role="row" class="odd">
<input type="hidden" name="EditedEntries.index" autocomplete="off" value="a2a18da0-528f-4b10-92c1-4a8ba7038dde">
    <td class="sorting_1">1</td>
    <td>1</td>
    <td>
        <input data-val="true" data-val-number="The field AdjHrs must be a number." data-val-required="The AdjHrs field is required." 
        id="EditedEntries_a2a18da0-528f-4b10-92c1-4a8ba7038dde__entry_AdjHrs" name="EditedEntries[a2a18da0-528f-4b10-92c1-4a8ba7038dde].entry.AdjHrs" type="text" value="0">
    </td>

它需要是什么

<tr role="row" class="odd">
<input type="hidden" name="EditedEntries.index" autocomplete="off" value="a2a18da0-528f-4b10-92c1-4a8ba7038dde">
    <td class="sorting_1">1</td>
    <td>1</td>
    <td>
        <input data-val="true" data-val-number="The field AdjHrs must be a number." data-val-required="The AdjHrs field is required." 
        id="EditedEntries_a2a18da0-528f-4b10-92c1-4a8ba7038dde_AdjHrs" name="EditedEntries[a2a18da0-528f-4b10-92c1-4a8ba7038dde].AdjHrs" type="text" value="0">
    </td>

所以它在标识符前面加上“foreach”的变量名,我可能只需要编写自己的助手。到时候我会回帖的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多