用于注销的布局中的 RedirectoAction 问题

Problem with RedirectoAction in Layout for logging out

我在这样的共享布局中有一个 ActionLink

@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })

在Home的控制器中

public ActionResult Logout()
    {
        Session.Abandon();
        Response.Cookies.Clear();

        return RedirectToAction("Login","Home");
    }

然后当我按下 Logout 按钮时,如果网页在 /Home 内,它 return 到 /Home/Login 正确,所有会话都被清除。但是当我尝试在 /Home 之外按注销时出现问题,例如在 /CourseUser 中,URL return 然后是 /CourseUser/Logout?Length=4 并且它不存在

我想要的是 return URL '/Home/Logout' 在任何情况下当我按下 'Logout'

感谢https://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/ajax-actionlink-and-html-actionlink-in-mvc/

问题来自

@Html.ActionLink("Logout", "Logout", "Home", new { @class = "navbar-btn btn btn-login" })

本例中的Home路由值,不是控制器名称。 解决方案:

@Html.ActionLink("Đăng xuất", "Logout", "Home", null, new { @class = "navbar-btn btn btn-login", @type = "button" })

@Html.ActionLink 将生成一个 link。单击它将导致对服务器的 HttpGet 请求。这对于任何不改变任何状态的东西都很好,因为 HttpGet 操作应该是幂等的——多次调用它具有相同的效果。

对于注销,我认为最佳实践和标准建议使用 HttpPost,您可以使用隐藏形式实现它 post:

<a href="javascript:$('#form-logout').submit();">
    Logout
</a>

@using(Html.BeginForm("logout", "account", new { area = "" }, FormMethod.Post, 
  new { @id = "form-logout", @class = "d-none" }))
{
    @Html.AntiforgeryToken();
}

单击 link 将触发隐藏表单的提交,这将 post 返回控制器中定义的注销方法,名称为 AccountController,例如:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Logout()
{
    Session.Abandon();
    Response.Cookies.Clear();

    return RedirectToAction("index", "dashboard", new { area = "" });
}

只需在第四个参数中添加null,如下所示:

//parameters in order: title, action name , controller name , route values, html attributes
@Html.ActionLink("Logout", "Logout", "Home",null, new { @class = "navbar-btn btn btn-login" })

或者您可以不添加 html 属性,如下所示

//parameters in order: title, action name , controller name
@Html.ActionLink("Logout", "Logout", "Home" })