Html.Action() Вызывает исключение StackOverflowException

По какой-то причине один из моих методов Html.Action() бросает исключение StackOverflowException, которое только улавливается, когда я отлаживаю экземпляр веб-сервера после того, как он застревает и перестает отвечать. Все, что я получаю, это:

Исправление System.StackOverflowException необработанное

Невозможно оценить выражение, поскольку текущий поток находится в переполнении стека состояние.

Линия, которая бросает исключение, такова:

<div id="userInfoSummary">@Html.Action("Summary", "User")</div>

Это происходит, когда я вхожу в систему, а затем перенаправляется на домашнюю страницу (что никогда не происходит, потому что оно застревает.

Здесь, как я проверяю, был ли пользователь зарегистрирован или нет, чтобы визуально отобразить представление:

<div id="userPanel">
                @if (!SessionManager.CheckSession(SessionKeys.User))
                {
                    <div id="loginForm">@Html.Action("Login", "User")</div>
                    <div id="registerForm">@Html.Action("Register", "User")</div>
                    <hr class="greyLine" />

                    <div id="recentlyViewedItems">
                        <div id="recentItemsTitle">
                            <span class="recentItemsIcon"></span><span class="theRecentTitle">Recently Viewed</span>
                        </div>
                    </div>
                }
                else
                {
                    <div id="userInfoSummary">@Html.Action("Summary", "User")</div>
                } 
            </div>

И вот мои ActionMethods:

    [HttpPost]
    public ActionResult Login(LoginViewModel dto)
    {
        bool flag = false;
        if (ModelState.IsValid)
        {
            if (_userService.AuthenticateUser(dto.Email, dto.Password, false)) {
                var user = _userService.GetUserByEmail(dto.Email);
                var uSession = new UserSession
                {
                    ID = user.Id,
                    Nickname = user.Nickname
                };
                SessionManager.RegisterSession(SessionKeys.User, uSession);
                flag = true;
            }
        }
        if (flag)
            return RedirectToAction("Index", "Home");
        else
        {
            ViewData.Add("InvalidLogin", "The login info you provided were incorrect.");
            return View(dto);
        }
    }

    public ActionResult Summary()
    {

        var user = _helper.GetUserFromSession();
        var viewModel = Mapper.Map<User, UserInfoSummaryViewModel>(user);
        return View(viewModel);
    }

Как получить дополнительную информацию об этом исключении? И почему это происходит в первую очередь? Я не думаю, что есть какие-то рекурсивные функции, которые идут бесконечно или бесконечный цикл... Может ли быть так, что я вызываю несколько методов Html.Action() в то же время?

Ответ 1

В любом случае вы не должны размещать вызов Html.Action в представлении Summary или он будет рекурсивно вызывать себя до тех пор, пока не закончится стека. Если вызов помещен в _Layout сайта, убедитесь, что вы возвращаете частичный вид в действии Summary, чтобы этот макет не был включен:

public ActionResult Summary()
{
    var user = _helper.GetUserFromSession();
    var viewModel = Mapper.Map<User, UserInfoSummaryViewModel>(user);
    return PartialView(viewModel);
}

или если вы не хотите изменять действие контроллера Summary, вы можете сделать следующее в части Summary.cshtml:

@{
    Layout = null;
}