Dot-Net
Html.Action() 導致 StackOverflowException
出於某種原因,我的 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() 方法?
在任何情況下,您都不應該將
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; }