Webgrid не обновляется после удаления MVC

Я удаляю строку в своей веб-сетке и перенаправляюсь на свой индекс GET, как обычно, после удаления. Однако, как и ожидалось, в моем представлении старая удаленная строка все еще находится в сетке. Я знаю, что это сделано по дизайну, и я должен иметь возможность установить Modelstate для очистки или удалить элемент по отдельности, чтобы добиться этого:

 ModelState.Remove("id");

Or

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

Or

 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 и т. д., но ни один из них, похоже, не решает мою проблему: after-model-submit">MVC 3 Представление не обновляется после отправки модели

Я также пытался перенаправить действие Index через jquery и вызвать действие контроллера удаления с помощью ajaxOptions , но это тоже не сработало.

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

И добавляем небольшой скрипт для вызова домашнего индекса:

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

Я явно делаю что-то не так. Есть ли другой способ принудительно обновить страницу по-другому, или кто-нибудь может заметить что-то явно неправильное в моем текущем подходе. Заранее спасибо.

Примечание. У меня есть разметка веб-сетки в представлении «Индекс», а не в отдельном частичном представлении, но я не думаю, что это должно быть причиной этого?

Обновление :

Вот метод GET по запросу: (для контекста объект фильтров используется, когда нажимается кнопка поиска и страница отправляется обратно, фильтры не применяются при начальной загрузке страницы)

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

person Alicia    schedule 15.05.2014    source источник
comment
Можете ли вы поделиться своим методом GET, на который вы перенаправляете?   -  person Krunal Patil    schedule 15.05.2014
comment
Конечно, это там сейчас   -  person Alicia    schedule 15.05.2014
comment
извините, вчера я был занят, поэтому не смог ответить, но если вы видите, что ваш метод GET принимает страницу строковых параметров, из-за которой, когда вы перенаправляете свое действие на индекс, оно не работает (не удалось найти это действие GET с именем Index с нет параметров), вам нужно передать этот строковый параметр при возврате, что-то вроде этого return RedirectToAction(Index, new { page = your_value_to_pass);   -  person Krunal Patil    schedule 16.05.2014
comment
Привет, Крунал, спасибо, что ответил мне. Это происходит в моем Index Action, у меня там есть точка останова, так что это должно быть что-то еще.   -  person Alicia    schedule 20.05.2014
comment
Вы пытались выполнить отладку с помощью метода индексирования и страницы конструктора? если да, это дало какую-либо ошибку? Также   -  person Krunal Patil    schedule 20.05.2014
comment
Нет ошибок нет. Я знаю, что это встроено в поведение MVC, и Html.Helpers предпочитает значения в коллекции ModelState фактическим значениям модели. так вот как это должно работать. Но мне нужен способ обновить мою страницу после удаления и существенно переопределить это поведение по умолчанию.   -  person Alicia    schedule 20.05.2014


Ответы (1)


Наконец-то мне удалось заставить это работать.

Если это поможет кому-то еще, вот что я сделал в конце. Я использовал решение, опубликованное Дрором здесь: Как добиться редактирования и удаления в Webgrid 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>";
  }
}

и изменил мой вызов удаления в моей веб-сетке на:

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

В контроллере:

[HttpPost]
public ActionResult Delete(int id)
{
   PerformDelete(id);
   return RedirectToAction("Index");
}
person Alicia    schedule 20.05.2014
comment
Я думаю, что ваше действие Index() кэшировано. У нас была такая же проблема. Раньше я устанавливал OutputCache(Duration=0, VaryByParam=*). вы можете установить VaryByParam=page, так как вы получаете индекс страницы. - person Sravan; 25.05.2014
comment
Привет Шраван, спасибо за подсказку! Я попытался украсить свой метод Index атрибутом [OutputCache(Duration=0, VaryByParam=page)] и передать параметр страницы при перенаправлении, но у меня был тот же результат, то есть результаты не обновлялись. - person Alicia; 26.05.2014