【问题标题】:Html.Action() Causes a StackOverflowExceptionHtml.Action() 导致 StackOverflowException
【发布时间】:2011-04-10 17:03:08
【问题描述】:

由于某种原因,我的 Html.Action() 方法之一抛出了 StackOverflowException,只有当我在 Web 服务器实例卡住并停止响应后调试它时才会捕获该异常。我得到的只是这个:

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() 方法?

【问题讨论】:

    标签: .net asp.net asp.net-mvc debugging asp.net-mvc-3


    【解决方案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;
    }
    

    【讨论】:

    • 该死!这一直发生在我身上!我总是返回一个视图而不是返回一个 PartialView!谢谢你发现那个达林,我真的很感激。附带说明一下,在 Login 操作方法中,如果 ModelState 有效,我应该返回什么?一个 View 或一个 PartialView(这实际上失败了)为了向用户显示错误......
    • @Kassem,如果没有关于您的场景的更多细节,很难说。也许您可以通过提供更多详细信息来开始一个新问题?
    • 当然。当我得到它时,我会这样做。非常感谢:)
    • 我不知道为什么我会遇到这个问题。我有return PartialView(viewModel);@{ Layout = null; }。该代码还在我的计算机上运行。它仅在发布后发生。我还有其他@Html.Actions 工作没有任何问题。
    • 我也在用ChildActionOnly
    猜你喜欢
    • 2011-11-23
    • 2016-12-16
    • 2021-02-09
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多