MVC 4 - действие контроллера LogOff, дающее 404, не найдено
Я просто завершаю проект колледжа, я не уверен, что слишком долго смотрю на свой компьютер и упускаю что-то очевидное, но когда я пытаюсь войти в систему, я получаю 404 не найден для URL/Account/LogOff.
У меня есть навигационная панель, в которой отображается "Вход/Выход" в зависимости от того, вошел ли пользователь или вошел в систему:
<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");
}
Может ли кто-нибудь сказать мне, почему это происходит - прежде чем я бросаю свой ноутбук к стене. Приветствия.
Ответы
Ответ 1
Вы используете ссылку (тег <a/>
) для выхода из системы, которая приводит к запросу HTTP GET, когда пользователь нажимает на нее, но ваше действие ограничено службой POST запрос (потому что он украшен атрибутом [HttpPost]
).
Вам нужно либо поместить вашу ссылку в форму, и сформировать запрос POST, либо удалить [HttpPost]
и [ValidateAntiForgeryToken]
(кредиты GalacticCowboy) из вашего действия.
Ответ 2
Так как logout изменяет состояние сервера, я бы не удалял [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>
}
Ответ 3
Я столкнулся с этой проблемой в устаревшем приложении. Способ, которым я его исправил, заключался в том, чтобы обнаружить, когда поставленный return Url был "/Account/LogOff" и действует соответствующим образом.
Из файла AccountController.cs 'Login':
if (returnUrl == "/Account/LogOff")
{
return this.RedirectToLocal(null);
}
else
{
return this.RedirectToLocal(returnUrl);
}