堆栈不足以继续安全地执行程序.ASP.NET MVC 4

Obs*_*vus 8 c# asp.net asp.net-mvc actionresult asp.net-mvc-4

我的搜索功能似乎在无限循环中继续,每当我的调试命中POST动作结果被触发时的动作.

在我的Masterpage.cshtml中,我有以下操作:

 <li>@Html.Action("Search", "Search")</li>
Run Code Online (Sandbox Code Playgroud)

这是导致以下错误的部分:

堆栈不足以继续安全地执行程序.这可能是因为调用堆栈上的函数太多或堆栈上的函数占用太多堆栈空间.

在我的SearchController中,我有一个get和post actionresult方法:

[HttpGet]
        public ActionResult Search()
        {
            return PartialView("SearchFormPartial");
        }
Run Code Online (Sandbox Code Playgroud)

这个返回包含以下内容的部分视图:

@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>      
}
Run Code Online (Sandbox Code Playgroud)

它基本上是一个带有文本框和提交按钮的表单.

这是http post actionresult:

[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");


    }
Run Code Online (Sandbox Code Playgroud)

它返回一个视图,其中包含一个viewmodel,其中包含与查询匹配的项目.

当我调试它时,一切都很完美,但一切似乎都无限重复.

Searchresult的视图如下所示:

@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
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是错误导致这种无限循环?我该如何解决?

在堆栈跟踪中,我发现了这些异常

[HttpException (0x80004005): Error executing child request for handler
Run Code Online (Sandbox Code Playgroud)

'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'.]

这个例外似乎越来越重复

Ufu*_*arı 8

Html.Action在母版页中使用POST请求调用Search方法,因此框架不会调用返回局部视图的操作,而是另一个返回带有母版页的ViewResult的操作.同样的事情会再次发生,你将进行递归调用.

最简单的解决方案是重命名响应POST请求的搜索操作.还要确保您的表单发布到此操作但保持相同的Html.Action调用.

看起来框架仍然会尝试找到可以响应POST请求的操作.HttpGet从"搜索"操作中删除属性将解决此问题.