我有一个带有不同用户帐户和密码的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");
}
答案 0 :(得分:9)
Html.ActionLink
呈现常规超链接,这会导致GET请求。
您的LogOff
具有HttpPost
属性,这意味着它只会回复POST请求。删除属性,您的操作将起作用。也不需要ValidateAntiForgeryToken
,它适用于表单。
注意:我不再支持原来的答案。虽然它解决了手头的问题,但由于browser prefetching和potential 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
不能用于发布方法。