在我看来,在foreach中不正确的模型值

本文关键字:模型 不正确 foreach 在我看来 | 更新日期: 2023-09-27 18:16:08

我有一个表,其中我保留了Roles的列表,其中有三列:Name和两个按钮EditDelete。当用户单击Edit时,它会将他们带到另一个表单,在那里他们可以编辑角色的名称。如果他们点击Delete,他们会得到一个模态对话框,要求他们在删除角色之前进行验证。

我的问题如下:如果我点击Edit按钮,它检测到正确的Role和正确的角色名称显示在出现的新表单中。但是,如果我单击Delete,它总是获取Model列表的第一个Role(即表的第一个角色),无论我单击哪一个。为什么?

这是我的观点:

<table class="table table-striped table-hover ">
    <thead>
        <tr>
            <th>@Resources.Role</th>
            <th></th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var role in Model)
        {
            <tr>
                <td>
                    @role.Name
                </td>
                <td>
                    @using (Html.BeginForm("RoleEdit", "Admin", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Get, new { @class = "form-horizontal", role = "form" }))
                    {
                        @Html.AntiForgeryToken()
                        @Html.HiddenFor(m => m.Where(r => r.Id.Equals(role.Id)).FirstOrDefault().Name)
                        <input type="submit" value="@Resources.Edit" class="btn btn-default btn-sm" />
                    }
                </td>
                <td>
                    <input type="submit" value="@Resources.Delete" class="btn btn-default btn-sm" data-toggle="modal" data-target="#confirm-delete" />
                    <div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                        <div class="modal-dialog">
                            <div class="modal-content">
                                <div class="modal-header">
                                    @Resources.DeleteRole
                                </div>
                                <div class="modal-body">
                                    @Resources.AreYouSureYouWantToDelete
                                    <hr />
                                    @role.Name
                                </div>
                                <div class="modal-footer">
                                    @using (Html.BeginForm("RoleDelete", "Admin", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                                    {
                                        @Html.AntiForgeryToken()
                                        @Html.HiddenFor(m => m.Where(r => r.Id.Equals(role.Id)).FirstOrDefault().Name)
                                        <button type="button" class="btn btn-default" data-dismiss="modal">@Resources.Cancel</button>
                                        <input type="submit" value="@Resources.Delete" class="btn btn-danger btn-ok" />
                                    }
                                </div>
                            </div>
                        </div>
                    </div>
                </td>
            </tr>
        }
    </tbody>
</table>

在我看来,在foreach中不正确的模型值

您的问题是,您正在创建重复的id属性在您的foreach循环(这是无效的html)在下面的代码行

上面的提交按钮的目标元素是id

<input type="submit" ... data-target="#confirm-delete" />

只返回第一个包含id="confirm-delete"

的元素解决这个问题的一种方法是确保元素具有唯一的id属性,例如
@{ int counter = 0; }
@foreach (var role in Model)
{
  var id = string.Format("confirm-delete-{0}", ++counter);
  var target = string.Format("#{0}", id);
  ....
  <input type="submit" ... data-target="@target" />
  <div class="modal fade" id="@id" ...>

然而,这种设计在每次迭代中生成一个单独的对话框,并生成许多额外的不必要的html。最好有一个对话框,并处理.submit()事件来显示对话框,如果返回false则取消提交。你还没有指出你使用哪个jquery插件的对话框,所以这将需要一个单独的问题的主题。

指出:

您可以通过使用链接来重定向到Edit()方法,而不是使用表单元素

来简化视图。
@Html.ActionLink("Edit", "RoleEdit", "Admin", new { ID = role.Id }, new { @class = "btn btn-default btn-sm" })

和int 'Delete'表单,您可以添加Id作为路由值,并省略隐藏的输入。还要注意,您删除的数据应该是POST,而不是GET

@using (Html.BeginForm("RoleEdit", "Admin", new { ReturnUrl = ViewBag.ReturnUrl, id = item.Id }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <input type="submit" value="@Resources.Edit" class="btn btn-default btn-sm" />
}
然而,处理'Delete'的更好方法是使用ajax发布值并返回指示成功或其他的结果,如果成功,则从DOM中删除相应的项。这允许用户停留在同一页面并继续删除其他项。