我有一个表格,其中列出了Roles
列表,其中包含三列:Name
和两个按钮Edit
和Delete
。当用户点击Edit
时,它会将他们带到另一个可以编辑角色名称的表单。如果他们点击Delete
,他们会在删除角色之前获得一个模态对话框,要求他们进行验证。
我的问题如下:如果我点击Edit
按钮,它会检测到正确的Role
,并且在出现的新表单中会显示正确的角色名称。但是,如果我点击Delete
,它总是抓住模型列表的第一个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>
答案 0 :(得分:1)
您的问题是您在以下代码行中的id
循环(无效的html)中创建了重复的foreach
属性
它上面的提交按钮是以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" })
并在“删除”表单中,您可以将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" />
}
然而,处理“删除”的更好方法是使用ajax发布值并返回指示成功或否则的结果,如果成功,则从DOM中删除相应的项。这允许用户保持在同一页面上并继续删除其他项目。