注销按钮在mvc应用程序中不起作用

时间:2014-06-13 15:23:31

标签: c# asp.net-mvc model-view-controller

我有一个带有不同用户帐户和密码的MVC应用程序。登录功能正常,但当我单击注销按钮时,我收到404错误说:

  

' /'中的服务器错误应用

     

无法找到资源。   说明:HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,其名称已更改,或暂时不可用。请查看以下网址,并确保正确拼写>

     

请求的网址:/帐户/登录

这是注销按钮的代码:

        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li>@Html.ActionLink("Log Off", "LogOff", "Account")</li>

            </ul>
        </div>

这是AccountController

中的代码
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        Session.Clear();
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home");
    }

4 个答案:

答案 0 :(得分:9)

Html.ActionLink呈现常规超链接,这会导致GET请求。

您的LogOff具有HttpPost属性,这意味着它只会回复POST请求。删除属性,您的操作将起作用。也不需要ValidateAntiForgeryToken,它适用于表单。


注意:我不再支持原来的答案。虽然它解决了手头的问题,但由于browser prefetchingpotential malicious behaviour,注销应该是POST。因此,不应使用超链接,而是应该有一个表单,其中提交按钮被设置为超链接。

答案 1 :(得分:1)

我有同样的问题,我通过创建一个隐藏的表单处理它,然后点击Log Out链接,它提交表单。喜欢这个

<form method="post" action="@Url.Action("LogOff", "Account")" id="signoutfrm" style="display:none;">
@Html.AntiForgeryToken()
</form>

<a href="" onclick="$('#signoutfrm').submit(); return false;">LOGOUT</a>

完美无缺

答案 2 :(得分:1)

只需添加@Stijn给出的答案:ActionLink向服务器发送获取请求,您的LogOff操作正在等待帖子请求包含 AntiForgeryToken

您需要创建一个表单,其中包含以下提交按钮:

 @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { role = "form" }))
 {
     @Html.AntiForgeryToken()
     <input type="submit" value="Logout" class="btn btn-primary"/>
 }

这会在帐户控制器中点击您的LogOff操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    AuthenticationManager.SignOut(
        DefaultAuthenticationTypes.ApplicationCookie);
    return RedirectToAction("Index", "Home");
}

答案 3 :(得分:0)

根据Microsoft MVC项目模板,

// Note: Action Name, Controller Name
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm"))
{
    @Html.AntiForgeryToken()

    <ul>            
    <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </ul>
}
  • 由于注销要求AntiForgeryToken,因此get方法中不允许这样做。您必须使用POST方法。

  • RedirectToAction不能用于发布方法。