Html.Action()导致StackOverflowException

时间:2011-04-10 17:03:09

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

由于某种原因,我的一个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()方法吗?

1 个答案:

答案 0 :(得分:36)

在任何情况下,您都不应该在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;
}