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