注销按钮在 mvc 应用程序中不起作用
Posted
技术标签:
【中文标题】注销按钮在 mvc 应用程序中不起作用【英文标题】:Log out button not working in mvc application 【发布时间】:2014-08-04 05:20:50 【问题描述】:我有一个具有不同用户帐户和密码的 MVC 应用程序。登录功能工作正常,但是当我单击注销按钮时,我收到 404 错误提示:
“/”应用程序中的服务器错误。
找不到资源。 说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、>其名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。
请求的 URL:/Account/LogOff
这是退出按钮的代码:
<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");
【问题讨论】:
我相信这是 HttpPost 属性。您是否尝试过删除它。 【参考方案1】:按照 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
不能用于 post 方法。
【讨论】:
【参考方案2】:只需添加@Stijn 给出的答案:ActionLink
向服务器发送 get 请求,而您的 LogOff
Action 需要一个 post 请求,其中包含 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】:Html.ActionLink
呈现常规超链接,这会导致 GET 请求。
您的LogOff
具有HttpPost
属性,这意味着它只会响应POST 请求。删除该属性,您的操作将起作用。 ValidateAntiForgeryToken
也不需要,它用于表单。
注意:我不再坚持我原来的答案。虽然它解决了手头的问题,但由于browser prefetching 和potential malicious behaviour,注销实际上应该是一个POST。因此,不应使用超链接,而应有一个带有超链接样式的提交按钮的表单。
【讨论】:
您发布的更新是很好的信息。【参考方案4】:我遇到了同样的问题,我通过创建一个隐藏的表单来处理它,然后单击“注销”链接,它会提交表单。像这样
<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>
效果很好
【讨论】:
以上是关于注销按钮在 mvc 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
@Html.ActionLink 在 mvc-5 中不起作用