Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 4-未找到注销控制器动作404_C#_Asp.net Mvc_Asp.net Mvc 4_Http Status Code 404 - Fatal编程技术网

C# MVC 4-未找到注销控制器动作404

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-

我刚刚结束一个大学项目,我不确定我是否已经盯着我的电脑太久了,并且错过了一些明显的东西,但是当我尝试注销一个用户时,我得到了一个404找不到的URL/帐户/注销

我有一个导航栏,显示登录/注销,具体取决于用户是已登录、已登录还是已注销:

<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);  
    }