2013-04-15 58 views
12

我只是完成了一個大學項目,我不知道我是否一直盯着我的電腦太久,錯過了明顯的東西,但當我嘗試登錄一個用戶,我得到一個404沒有找到URL /帳戶/註銷。MVC 4 - LogOff控制器操作給404沒有發現

我有一個導航欄,顯示登錄/註銷取決於用戶是否是登錄,或註銷:

<div class="nav-collapse collapse"> 
    <ul class="nav pull-right"> 
     <li class="dropdown" id="dropdown-login-div"> 
      @if (!Request.IsAuthenticated) 
      { 
       <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a> 
      } 
      else 
      { 
       @Html.ActionLink("Log Off", "LogOff", "Account") 
      } 
      <div class="dropdown-menu" id="dropdown-login"> 
       @Html.Partial("~/Views/Account/_LoginPartial.cshtml", new ViewDataDictionary<LetLord.Models.LoginModel>()) 
      </div> 
     </li> 
    </ul> 
</div> 

在我的賬戶控制器自帶的Internet的默認註銷等動作模板:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult LogOff() 
{ 
    WebSecurity.Logout(); 

    return View("Index"); 
} 

有人能告訴我爲什麼會發生這種情況 - 在我將筆記本電腦靠在牆上之前。乾杯。

回答

39

您使用的鏈接(<a/>標籤)註銷導致HTTP GET請求時,用戶點擊它,但你的行動被限制服務POST唯一的要求(因爲它是裝飾有[HttpPost]屬性) 。

您需要將您的鏈接放入表單並生成POST請求,或從您的操作中刪除[HttpPost][ValidateAntiForgeryToken](貸記給GalacticCowboy)。

+0

這是正確的 - 而我的建議是,除去HttpPost而不是創建一個表單註銷。由於您沒有向服務器提交任何數據,所以GET最適合註銷操作。 –

+0

'ValidateAntiForgeryToken'將失敗,因爲它不是表單文章。 – GalacticCowboy

+0

完全覆蓋了我的頭。謝謝。 – MattSull

28

由於註銷修改服務器的狀態,我不會刪除[HttpPost]和[ValidateAntiForgeryToken] 相反,我會用下面的

@using (Html.BeginForm("Log Out", "Account", FormMethod.Post, 
new { id = "logoutForm" })) 
{ 

    @Html.AntiForgeryToken() 
    <a href="javascript:document.getElementById('logoutForm').submit()">Log Out</a> 

} 
+0

非常好的解決方案,容易實現並解釋問題。 – Gent

0

我就遇到了這個問題上的遺留應用程序替換鏈接(錨標記) 。我修正它的方法是檢測提供的返回Url何時爲'/ Account/LogOff',並據此採取行動。 從「AccountController.cs」文件,「登錄」方法:

if (returnUrl == "/Account/LogOff") 
    { 
     return this.RedirectToLocal(null); 
    } 
    else 
    { 
     return this.RedirectToLocal(returnUrl); 
    }  
相關問題