LogOff控制器动作给出404未找到

本文关键字:控制器 LogOff | 更新日期: 2023-09-27 18:09:32

我刚刚完成了一个大学项目,我不确定我是否一直盯着我的电脑太久,错过了一些明显的东西,但是当我试图注销一个用户时,我得到一个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>

在我的帐户控制器中,Internet模板自带的默认LogOff操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    WebSecurity.Logout();
    return View("Index");
}

谁能告诉我为什么会这样-在我把笔记本电脑扔到墙上之前。欢呼。

LogOff控制器动作给出404未找到

你使用一个链接(<a/>标签)注销,导致HTTP GET请求当用户点击它,但你的行动被限制为服务POST请求仅(因为它是用[HttpPost]属性装饰)。

您要么需要将链接放入表单并生成POST请求,要么从您的操作中删除[HttpPost][ValidateAntiForgeryToken](归功于GalacticCowboy)。

因为注销会修改服务器状态,所以我不会删除[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>
}

我在一个遗留应用程序上遇到了这个问题。我修复它的方法是检测提供的返回Url何时为'/Account/LogOff'并采取相应行动。从'AccountController.cs'文件中,'Login'方法:

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