Недостаточно стека для безопасного продолжения выполнения программы. ASP.NET MVC 4

Моя функция поиска, кажется, продолжается в бесконечном цикле, каждый раз, когда моя отладка вызывает действие ниже результата действия POST.

В моем Masterpage.cshtml у меня есть следующее действие:

 <li>@Html.Action("Search", "Search")</li>

Это часть, которая получает следующую ошибку:

Недостаточно стека для безопасного продолжения выполнения программы. Это может произойти из-за слишком большого количества функций в стеке вызовов или функций в стеке, использующих слишком много места в стеке.

В моем SearchController у меня есть один метод get и post actionresult:

[HttpGet]
        public ActionResult Search()
        {
            return PartialView("SearchFormPartial");
        }

Этот возвращает частичное представление со следующим содержимым:

@using (Ajax.BeginForm("Search", "Search", FormMethod.Post,
        new AjaxOptions
        {
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "POST"

         }))
{
<div>
    @Html.TextBox("query", "", new { @class = "search-query", @placeholder="Search news...", @spellcheck="false"})
    <input type="submit" value="Search" />
</div>      
}

По сути, это форма с текстовым полем и кнопкой отправки.

Это результат действия http post:

[HttpPost]

    public ActionResult Search(string query)
    {
        if (query != null)
        {
            try
            {

                var searchlist = rep.Search(query);

                var model = new ItemViewModel()
                {
                    NewsList = new List<NewsViewModel>()
                };

                foreach (var NewsItems in searchlist)
                {
                    FillProductToModel(model, NewsItems);
                }


                return View("Searchresults", model);
            }
            catch (Exception e)
            {
                // handle exception
            }
        }
        return View("Error");


    }

Он возвращает представление с моделью представления, которая содержит элементы, соответствующие запросу.

Когда я его отлаживаю, все работает отлично, но кажется, что все повторяется бесконечно.

Представление результатов поиска выглядит следующим образом:

@model Namespace.ViewModels.ItemViewModel
@if (Model.NewsList.Count == 0)
{
    <h3 class="text-error">No items matched your search query!</h3>
}
else
{
    foreach (var result in Model.NewsList)
    {
        // display search results
    }
}

Что именно здесь происходит не так, что вызывает этот бесконечный цикл? и как я могу это исправить?

В трассировке стека я нашел эти исключения

[HttpException (0x80004005): Error executing child request for handler

«System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper».]

это исключение кажется повторяющимся


person Obsivus    schedule 20.05.2013    source источник
comment
нет, но когда итерация завершена, она переходит на masterpage.cshtml и Html.Action(Search,Search).   -  person Obsivus    schedule 21.05.2013
comment
Вы получаете сообщение об ошибке при публикации в поиске?   -  person Ufuk Hacıoğulları    schedule 21.05.2013
comment
Я получаю сообщение об ошибке, когда перестаю запускать веб-приложение. В противном случае это просто бесконечный цикл, что означает, что когда я набираю текст и нажимаю «Отправить», он просто загружается.   -  person Obsivus    schedule 21.05.2013
comment
Не должно быть проблем, когда вы вызываете действие поиска с запросом GET, оно возвращает PartialViewResult. Вы должны получить сообщение об ошибке при выполнении POST-запроса.   -  person Ufuk Hacıoğulları    schedule 21.05.2013
comment
Когда я отлаживаю post actionresults, происходит вот что: он возвращает представление и проходит через все внутри представления, затем переходит к masterpage.cshtml, когда попадает в Html.Action(Search,Search) . Он переходит непосредственно к результату действия Post и так далее.   -  person Obsivus    schedule 21.05.2013
comment
какие маршруты вы задекларировали? после прочтения вашего последнего комментария я думаю, что там может быть что-то не так   -  person ppetrov    schedule 21.05.2013
comment
плохое обновление с маршрутами 1 сек   -  person Obsivus    schedule 21.05.2013
comment
неправильное предположение извините, ваши маршруты в порядке   -  person ppetrov    schedule 21.05.2013


Ответы (4)


Html.Action на главной странице вызывает метод Search с запросом POST, поэтому платформа не будет вызывать действие, которое возвращает частичное представление, а другое, которое возвращает ViewResult с главной страницей. То же самое произойдет снова, и вы будете делать рекурсивные вызовы.

Самым простым решением было бы переименовать действие поиска, которое отвечает на запрос POST. Также убедитесь, что ваша форма публикует это действие, но сохраняет тот же вызов Html.Action.

Похоже, что фреймворк все равно попытается найти действие, которое может ответить на запрос POST. Удаление атрибута HttpGet из действия поиска решит эту проблему.

person Ufuk Hacıoğulları    schedule 20.05.2013
comment
Я переименовал результат действия сообщения в SearchResult, а внутри частичного представления я изменил его на @using (Ajax.BeginForm(SearchResult, Search, FormMethod.Post, new AjaxOptions, но теперь я получаю сообщение об ошибке: Ошибка выполнения дочернего запроса для обработчика System.Web.Mvc .HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper». - person Obsivus; 21.05.2013
comment
@Obsivus Можете ли вы закомментировать весь код в своем частичном представлении и посмотреть, получите ли вы ту же ошибку? - person Ufuk Hacıoğulları; 21.05.2013
comment
если я прокомментирую, нет текстового поля или кнопки отправки, я не могу проверить, работает это или нет - person Obsivus; 21.05.2013
comment
Если вы не получаете никаких ошибок, это означает, что что-то не так с вашим представлением. - person Ufuk Hacıoğulları; 21.05.2013
comment
даже если я прокомментирую материал в представлении, я нахожусь в бесконечном цикле из-за этого действия на моей мастер-странице - person Obsivus; 21.05.2013
comment
@Obsivus Удалите HttpGet из действия поиска и используйте переименованный метод для POST. Меня устраивает. - person Ufuk Hacıoğulları; 21.05.2013

Он не видит ваш частичный вид как «частичный вид». У меня была точно такая же проблема, но добавление @{ Layout = null; } к представлению гарантирует, что представление не будет рассматриваться как обычное представление, которое загружает представление _Layout.

person Gabriel    schedule 10.09.2014

Вопрос здесь на самом деле очень простой - он должен быть

<li>@Url.Action("Search", "Search")</li>

вместо

<li>@Html.Action("Search", "Search")</li>

См. Url против Html - @Url сгенерирует строку ссылки, а @Html попытается сгенерировать результат действия (что может привести к бесконечному циклу)

person Grengas    schedule 28.01.2020

Моя проблема в том, что я добавил новое представление через визуальную студию, и он добавил страницу _ViewStart.cshtml с макетом, который вызывал рекурсию.

person Ben    schedule 04.10.2016