Dot-Net

Html.Action() 導致 StackOverflowException

  • April 10, 2011

出於某種原因,我的 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;
}

引用自:https://stackoverflow.com/questions/5613324