我在使用Ajax的PartialView中更新记录时遇到问题。我有一个调用@Html.Action(" _PartialView"," Controller",new {id = OrderId})和PartialView with Ajax Form。
@model IEnumerable<WebMartin.Models.OrderExecutionRemark>
@{
AjaxOptions ajaxOpts = new AjaxOptions
{
UpdateTargetId = "orderdisplayremark",
Url = Url.Action("OrderRemarkDelete", "OrderExecution"),
HttpMethod = "POST"
};
}
@ViewBag.Po
@if (Model.Any())
{
<table id="orderdisplayremark">
<thead>
<tr>
<th>Worker</th>
<th>Date</th>
<th>Remark</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var remark in Model)
{
<tr>
<td>@remark.UserName</td>
<td>@remark.OrderRemarkDate.ToString("yyyy-MM-dd")</td>
<td>@remark.OrderRemarkText</td>
<td>
@using (Ajax.BeginForm(ajaxOpts))
{
@Html.Hidden("remarkid", remark.OrderRemarkId)
<input type="submit" value="Delete" />
}
</td>
</tr>
}
</tbody>
</table>
}
和控制器
[HttpPost]
public PartialViewResult OrderRemarkDelete(int remarkid)
{
OrderExecutionRemark oer = db.OrderExecutionRemarks.Find(remarkid);
/* db.OrderExecutionRemarks.Remove(oer);
db.SaveChanges(); */
ViewBag.Po = oer.OrderRemarkId;
return PartialView("_OERemarkPartial", db.OrderExecutionRemarks.Where(p => p.OrderId == oer.OrderId).ToList());
}
[HttpGet]
[ChildActionOnly]
public PartialViewResult _OERemarkPartial(int id = 0)
{
return PartialView(db.OrderExecutionRemarks.Where(p => p.OrderId == id).ToList());
}
问题
更新仅适用于第一次,之后 - 不是。我必须在推送之前刷新页面&#34;删除&#34;按钮再次。如何解决?我以为我使用RedirectToAction(View),但我在三个不同的视图中使用这个PartialView。
PartialView中的是工序发出的订单显示备注。正如您所看到的,每一行都包含工作人员姓名,日期,备注文本以及将id注释传递给删除操作的表单。如果我有很多评论(很多行)和第一篇帖子(删除)备注后,应该用记录更新表格,当我想删除下一条备注时,我就不能这样做了。如果我想删除下一个注释,我必须先按F5(刷新页面)。哪里错了?
提前感谢您的所有答案。
答案 0 :(得分:0)
只要您尝试删除表格中的其他项目,您的代码就可以正常工作。理想情况下,在成功调用action方法删除记录之后,您只需要从UI中删除该项,以便use不会再尝试删除它!
为此,您可以在AjaxOptions中指定OnSuccess属性。这将是一个javascript方法,并将在ajax调用从服务器获得200响应后执行。
@{
AjaxOptions ajaxOpts = new AjaxOptions
{
UpdateTargetId = "orderdisplayremark",
Url = Url.Action("OrderRemarkDelete", "Home"),
HttpMethod = "POST",
OnSuccess = "DeletionCompleted"
};
}
现在在这种方法中,您所要做的就是删除单击删除按钮的当前行
function DeletionCompleted()
{
$(this).closest("tr").remove();
}
此代码不会使用新数据重新加载整个表内容(即使您当前的方法返回部分视图)。它只是删除该行。所以在这种情况下,你真的不需要返回局部视图
[HttpPost]
public PartialViewResult OrderRemarkDelete(int remarkid)
{
varoer = db.OrderExecutionRemarks.Find(remarkid);
db.OrderExecutionRemarks.Remove(oer);
db.SaveChanges();
return Json(new { message="successfully deleted"});
}
如果你真的想用部分视图结果(更新的表 - 你的旧代码)替换现有的表内容,你也可以这样做。
function MyComplete(res) {
$("#orderdisplayremark").html(res);
}