2013-04-15 3 views
12

Я просто завершаю проект колледжа, я не уверен, что слишком долго смотрел на свой компьютер и упускал что-то очевидное, но когда я пытаюсь чтобы вывести пользователя из системы, я получаю 404, не найденный для URL/Account/LogOff.MVC 4 - действие контроллера LogOff, дающее 404 не найдено

У меня есть Navbar, который показывает Вход/выход в зависимости от того, является ли пользователь, войти в систему, или, логаут:

<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> 

В мой контроллер счета действия LOGOFF по умолчанию, который поставляется с Интернетом шаблон:

[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

Поскольку выход из системы изменяет состояние сервера, я Wouldnt удалить [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

я столкнулся с этой проблемой на унаследованных приложений , Способ, которым я его исправил, заключался в том, чтобы обнаружить, когда поставленный return Url был «/ Account/LogOff» и действует соответствующим образом. из файла «AccountController.cs», «Login» метод:

if (returnUrl == "/Account/LogOff") 
    { 
     return this.RedirectToLocal(null); 
    } 
    else 
    { 
     return this.RedirectToLocal(returnUrl); 
    }  
Смежные вопросы