C# MVC 4-未找到注销控制器动作404
我刚刚结束一个大学项目,我不确定我是否已经盯着我的电脑太久了,并且错过了一些明显的东西,但是当我尝试注销一个用户时,我得到了一个404找不到的URL/帐户/注销 我有一个导航栏,显示登录/注销,具体取决于用户是已登录、已登录还是已注销:C# MVC 4-未找到注销控制器动作404,c#,asp.net-mvc,asp.net-mvc-4,http-status-code-404,C#,Asp.net Mvc,Asp.net Mvc 4,Http Status Code 404,我刚刚结束一个大学项目,我不确定我是否已经盯着我的电脑太久了,并且错过了一些明显的东西,但是当我尝试注销一个用户时,我得到了一个404找不到的URL/帐户/注销 我有一个导航栏,显示登录/注销,具体取决于用户是已登录、已登录还是已注销: <div class="nav-collapse collapse"> <ul class="nav pull-right"> <li class="dropdown" id="dropdown-login-
<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>
在我把笔记本电脑扔到墙上之前,有人能告诉我为什么会这样吗。干杯。您使用一个链接(
标记)注销,当用户单击该链接时,会产生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>
}
@使用(Html.BeginForm(“注销”、“帐户”、FormMethod.Post、,
新的{id=“logoutForm”})
{
@Html.AntiForgeryToken()
}
我在一个旧版应用程序上遇到了这个问题。我修复它的方法是检测所提供的返回Url何时为“/Account/LogOff”,并相应地采取行动。
从“AccountController.cs”文件中的“Login”方法:
if (returnUrl == "/Account/LogOff")
{
return this.RedirectToLocal(null);
}
else
{
return this.RedirectToLocal(returnUrl);
}
这是正确的-我的建议是删除HttpPost,而不是创建一个表单来注销。由于您没有向服务器提交任何数据,GET最适合用于注销操作。
ValidateAntiForgeryToken
也将失败,因为它不是表单帖子。完全超出了我的理解范围。谢谢。不要使用Get注销(注销它会修改服务器state@JeanJimenez没有正确的解决方案。只有在其他选项不正确的情况下,解决方案才是正确的。非常好的解决方案,易于实施并解释了问题。谢谢!
if (returnUrl == "/Account/LogOff")
{
return this.RedirectToLocal(null);
}
else
{
return this.RedirectToLocal(returnUrl);
}