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 и т.н., но изглежда никой не решава проблема ми: 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 действие, наречено индекс с без параметри), трябва да подадете този низов параметър, когато се върнете, нещо като това return RedirectToAction(Index, new { page = your_value_to_pass);   -  person Krunal Patil    schedule 16.05.2014
comment
Здравей Крунал, благодаря, че се свърза с мен. Става в моето Index Action OK, имам точка на прекъсване там, така че трябва да е нещо друго.   -  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)


Най-накрая успях да накарам това да работи.

Ако помага на някой друг, ето какво направих в крайна сметка. Използвах решение, публикувано от Dror тук: Как за постигане на редактиране и изтриване в 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
Здравей Сраван, благодаря за съвета! Опитах се да декорирам моя индексен метод с атрибута [OutputCache(Duration=0, VaryByParam=page)] и да предам параметъра на страницата при пренасочване, но имах същия резултат, т.е. резултатите не се опресняват. - person Alicia; 26.05.2014