9

我的搜索功能似乎在无限循环中继续,每次我的调试点击 POST actionresult 下方的操作时都会被触发。

在我的 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 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");


    }

它返回一个带有视图模型的视图,其中包含与查询匹配的项目。

当我调试它时,一切正常,但一切似乎都在无限重复。

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

这里到底出了什么问题导致这个无限循环?我该如何解决?

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

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

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

这个异常似乎在重复

4

4 回答 4

9

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

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

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

于 2013-05-20T21:54:33.190 回答
2

它没有将您的部分视图视为“部分视图”。我遇到了完全相同的问题,但添加 @{ Layout = null; } 到视图可确保视图不会被视为加载 _Layout 视图的普通视图。

于 2014-09-10T13:51:40.080 回答
1

这里的问题其实很简单——应该是

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

代替

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

参见Urlvs Html-@Url会生成一串链接,while@Html会尝试生成动作的结果(可能会导致死循环)

于 2020-01-28T13:00:31.383 回答
0

我的问题是我通过 Visual Studio 添加了一个新视图,它添加了一个 _ViewStart.cshtml 页面,该页面的布局导致递归。

于 2016-10-04T20:28:21.167 回答