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);  
    }