.net - Html.Action() 导致 StackOverflowException

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

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

System.StackOverflowException was unhandled

Cannot evaluate expression because the current thread is in a stack overflow state.



抛出异常的行是这样的:
<div id="userInfoSummary">@Html.Action("Summary", "User")</div>
当我登录然后被重定向到主页时会发生这种情况(这永远不会发生,因为它被卡住了。

以下是我如何检查用户是否已登录以适本地呈现 View :
<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() 方法?

最佳答案

在任何情况下,您都不应该放置 Html.Action调用 Summary否则它会递归调用自己,直到用完堆栈。如果调用位于 _Layout确保您在 Summary 中返回部分 View 操作,以便不包括此布局:

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

或者如果您不想修改您的 Summary Controller 操作,您可以在 Summary.cshtml 中执行以下操作部分的:
@{
    Layout = null;
}

关于.net - Html.Action() 导致 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613324/

相关文章:

c# - 相同类型对象的 InvalidCastException - 自定义控件加载

asp.net-mvc - 为什么 MVC Model Binder 集需要 int、long 值?

.net - 如何从文件加载图像而不保持文件锁定?

javascript - 是否有提供类似 "Wall"功能的 Web 框架或项目

.net - 如何设置项目以使用 WcfSvcHost.exe 和 WcfTestClient.exe

c# - 类型转换匿名类型抛出类型转换错误

asp.net-mvc - 如何在.NET MVC3 HTML 表单中所需的可空日期时间中允许空值?

c# - 防止 ASP.NET Web API 路由引擎扣除自定义方法名称

c# - Marshal.SizeOf(Type t) 函数

c# - 通用类型类型转换方法(.Net)