Проблема с RedirectoAction в Layout для выхода из системы - PullRequest
0 голосов
/ 14 июля 2020

У меня есть 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, он возвращается к /Home/Login правильно, при этом все сеансы очищаются. Но проблема возникает, когда я пытаюсь нажать Выход за пределами /Home, например, в /CourseUser, тогда возвращается URL-адрес /CourseUser/Logout?Length=4, а его не существует

Я хотел вернуть URL-адрес '/ Home / Logout 'при любых обстоятельствах, когда я нажимаю' Logout '

Ответы [ 3 ]

0 голосов
/ 14 июля 2020

@Html.ActionLink создаст ссылку. Щелчок по нему приведет к запросу HttpGet на сервер. Это нормально для всего, что не меняет состояние, потому что действия HttpGet должны быть идемпотентными - вызов его несколько раз дает тот же эффект.

Для выхода из системы я думаю, что лучшие практики и стандарты рекомендуют используйте HttpPost, который вы можете реализовать с помощью сообщения скрытой формы:

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

Щелчок по ссылке вызовет отправку скрытой формы, которая отправит обратно метод выхода, определенный в контроллере, с именем AccountController, для например:

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

    return RedirectToAction("index", "dashboard", new { area = "" });
}
0 голосов
/ 14 июля 2020

просто добавьте 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" })
0 голосов
/ 14 июля 2020

Престижность 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" })
...