首页 > 解决方案 > 为什么注销用户不起作用?

问题描述

我想注销用户功能。

当用户单击此 linq 时:

  <a tabindex="-1" href="javascript:document.getElementById('logoutForm').submit()"><i class="glyphicon glyphicon-off"></i>LogOff </a>

这个动作叫做:

  [Authorize]
public class AccountController : BaseController
{
    // POST: /Account/LogOff
    [HttpPost]
    //[ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
}

虽然我把上面的 linq 变成了这个:

@Ajax.ActionLink(@Resources.Resources.LogOff, "LogOff", "Account", new { id = "logoutForm" }, new AjaxOptions { HttpMethod = "POST" })

我得到错误:

说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。请求的 URL:/MySiteName/Account/LogOff/logoutForm

知道为什么第二种态度有效吗?为什么我在我的 URL 中得到 logoutForm 作为后缀?

标签: asp.net-mvc

解决方案


/MySiteName/Account/LogOff/logoutForm根本不存在的路线。id您正在将带有值的路由参数传递"logoutForm"给您的路由,但操作方法 LogOff 不接受任何参数。这也正是错误告诉您的内容。您可以通过查看您的操作方法的签名来验证这一点:

public ActionResult LogOff() {}

如您所见,它不带任何参数,因此您必须调用的 url 与它上面的评论中所述的相同:// POST: /Account/LogOff

这反过来意味着,删除你的路由参数,所以只需替换new { id = "logoutForm" }null

@Ajax.ActionLink(@Resources.Resources.LogOff, "LogOff", "Account", null, new AjaxOptions { HttpMethod = "POST" })

你应该很高兴。

我看不出原因,为什么 Log out 本身应该是一个帖子。您没有向服务器提交任何数据。你可以做一个简单的 GET,达到同样的效果,并在此过程中消除一些不必要的复杂性。


推荐阅读