ASP.NET MVC BeginCollectionItem issue

本文关键字:issue BeginCollectionItem MVC NET ASP | 更新日期: 2023-09-27 18:30:32

我在使用 HTML 帮助程序BeginCollectionItem时遇到问题。它似乎将项目绑定到视图,但更改未传播。

我有一个部分视图,绑定到它的模型是一个IEnumerable.下面是一个片段。

<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 调用返回到部分视图。

ASP.NET MVC BeginCollectionItem issue

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>

所以我设法找到了问题的原因。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"的变量名,我可能只需要编写自己的助手。当我这样做时,我会回帖。