Проблема в том, что вы вызываете действие DeleteProduct
с AJAX, и это действие выполняет действие Перенаправления на продукты. За исключением того, что действие Products возвращает полный HTML вместо частичного. Таким образом, вы получаете jquery.unobtrusive-ajax.js
, введенный дважды в вашу DOM. Таким образом, вы получите 2 подтверждения при втором удалении, 3 при третьем и т. Д.
Итак, начнем с определения части, содержащей записи таблицы (~/Views/Admin/_Products.cshtml
):
@model IEnumerable<Domain.Entities.Product>
<div>@ViewData["message"]</div>
<table class="Grid">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Description</td>
<td>@item.Price</td>
<td>
@using (Ajax.BeginForm("DeleteProduct", "Admin",
new AjaxOptions {
Confirm = "Are you sure you wanna delete this product?",
UpdateTargetId = "products"
})
)
{
@Html.Hidden("Id", item.Id)
<input type="image" src="@Url.Content("~/Images/Icons/DeleteIcon.jpg")" alt="Delete" />
}
</td>
</tr>
}
</tbody>
</table>
, а затем измените ваш основной вид, чтобы он использовал этот частичный:
@model IEnumerable<Product>
@{
ViewBag.Title = "Products";
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<h1>Products</h1>
<div id="products">
@Html.Partial("_Products")
</div>
и, наконец, измените действие контроллера DeleteProduct
так, чтобы оно больше не делало перенаправлений, а вместо этого возвращает частичное после удаления записи:
[HttpPost]
public ActionResult DeleteProduct(int id)
{
Product prod = productRepository.Products.FirstOrDefault(p => p.Id == id);
if (prod != null)
{
productRepository.DeleteProduct(prod);
ViewData["message"] = string.Format("{0} was deleted", prod.Name);
}
return PartialView("_Products", productRepository.Products);
}