删除MVC后Webgrid没有刷新

时间:2014-05-15 11:29:59

标签: asp.net-mvc razor entity-framework-5 webgrid

我正在删除webgrid中的一行,并在删除后正常重定向到我的GET索引。 但是正如预期的那样,我的视图显示仍在网格中的旧删除行。我知道这是设计的,我应该能够将Modelstate设置为清除,或者单独删除项目以实现此目的:

 ModelState.Remove("id");

或者

 foreach (var key in ModelState.Keys.Where(m => m.StartsWith("id")).ToList())
            ModelState.Remove(key);

 ModelState.Remove("Applicant.ApplicantId"); 

甚至:

ModelState.Clear()

然而,没有人为我工作。

这是我的删除方法(简化 - 所有错误处理和非必要代码删除)

 public ActionResult DeleteApplicant(int id)
    {

            var q =
                        (from a in context.Applicants
                         where a.ApplicantId == id
                         select a).Single<Applicant>();



            q.ApplicantDocuments.ToList().ForEach(r => context.ApplicantDocuments.Remove(r));

            context.Applicants.Remove(q);
            context.SaveChanges();



        foreach (var key in ModelState.Keys.Where(m => m.StartsWith("id")).ToList())
        ModelState.Remove(key);

        TempData["SuccessMessage"] = "Successfully deleted row.";

        return RedirectToAction("Index");
    }

这是我从视图中调用我的删除方法:

  , grid.Column(format: (item) => @Html.ActionLink("Delete", "DeleteApplicant",
                                      new { id = item.ApplicantId }, new { @class = "delete-link" }), style: "DeleteButton")

我已经查看了stackoverflow等上的各种帖子,但似乎没有解决我的问题:MVC 3 The View is not being refreshed after model submit

我尝试过尝试通过jquery重新定向到Index操作并使用ajaxOptions调用delete控制器操作,但这也没有用。

            , grid.Column(format: (item) => @Ajax.ActionLink("Delete", "DeleteApplicant",
    new { id = item.ApplicantId },
    new  AjaxOptions  { HttpMethod = "GET" , OnSuccess= "reloadGrid" }))

添加一个小脚本来调用home索引:

 function reloadGrid() {
    var pathArray = window.location.pathname.split('/');
    var segment_1 = pathArray[1];
    var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/Index";

    $.ajax(
        {
            type: "GET",
            url: newURL,
            data: "{}",
            cache: false,
            dataType: "html",
            success: function (data)
            { $().html(data); }
        })
}

我显然做错了什么。有没有其他方法我可以用不同的方式强制刷新页面,或者任何人都可以发现当前方法中明显错误的任何内容。提前谢谢。

注意:我的索引视图上有我的webgrid标记,而不是单独的部分视图但我不认为这应该导致这个吗?

更新

这里是按要求提供的GET方法:(对于上下文,单击搜索按钮并回发页面时使用filters对象,初始页面加载时不应用过滤器)

public ActionResult Index(string page)
        {
                /////Peform paging initiation
                int pageIndex = 0;
                if (!string.IsNullOrEmpty(page))
                {
                    pageIndex = int.Parse(page) - 1;
                }

                ////initialize total record count and filter results object
                int totalRecordCount = 0;

                var filters = new ApplicantSearchFilter();

                ////Perform search with paging
                var applicants = this.GetApplicantsPaging(filters ,pageIndex, out totalRecordCount);

                ////Return view type
                var data = new ApplicantViewModel()
                {
                    Filters =filters ,
                    TotalRecordCount = totalRecordCount,
                    ApplicantReportLists = applicants,
                    PageIndex = pageIndex,
                };

                ////return Index view passing data result to build it
                return this.View("Index", data);
            }
        }

1 个答案:

答案 0 :(得分:1)

我终于设法让这个工作了。

如果这对其他任何人有帮助,那么我到底做了什么。我在这里使用了Dror发布的解决方案:How to achieve edit and delete on Webgrid of MVC3 Razor?。他在网上将一个GET删除调用转为帖子。不完全是我想要的,但它的确有效。

有没有人有更好的替代解决方案?

查看代码:

添加功能:

@functions{
  string Delete(dynamic p)
  {
    string actionController = Url.Action("Delete", "Admin", new {id=p.AccountId});
    return "<form style='display:inline;' method='post' action='" + actionController + "'><input type='submit' value='Delete' onclick=\"return confirm('Are you sure?')\"/></form>";
  }
}

并将我的webgrid中的删除调用更改为:

grid.Column(header: "", format: p => Html.Raw(Delete(p)))

在控制器中:

[HttpPost]
public ActionResult Delete(int id)
{
   PerformDelete(id);
   return RedirectToAction("Index");
}