Ajax Update仅适用于第一次

时间:2016-10-20 17:21:36

标签: html ajax asp.net-mvc

我在使用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(刷新页面)。哪里错了?

提前感谢您的所有答案。

1 个答案:

答案 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);
}