Как запустить LogOut Action в Home Controller, который не может быть запущен с помощью ActionLink? - PullRequest
1 голос
/ 01 июля 2019

My Home Controller Как это:

public class HomeController : Controller
{


    ....


    [ActionName("Login")]
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(string UserName, string Password)
    {
        try
        {
            var query = user_Repository.Login(UserName, Password);

            if (query != null)
            {


                Session["UserName"] = query.UserName;
                Session["IsAdmin"] = query.IsAdmin;

                return RedirectToAction("Index", "News");
            }
            ViewBag.ErrorMessage = "نام كاربري يا رمز عبور صحيح نمي باشد";
            return View();



        }
        catch (Exception e)
        {
            ViewBag.ErrorMessage = " خطا!!! ";
            return View();
        }
    }


    public ActionResult LogOut()
    {
        if (Request.Cookies["user"] != null)
        {
            var user = new HttpCookie("user")
            {
                Expires = DateTime.Now.AddDays(-1),
                Value = null
            };
            Response.SetCookie(user);
            Response.Cookies.Clear();

        }
        if(Session["UserName"] != null)
        {
            Session["UserName"] = null;
            Session["IsAdmin"] = null;
        }
        Session.Clear();
        return RedirectToActionPermanent("Index");
    }
}

Когда я использую ActionLink в _Layout для запуска действия выхода из системы в Home Controller, этот ActionLink вместо выполнения действия выхода из системы будет выполнен вход в систему !!! Мой ActionLink Нравится это:

  @Html.ActionLink("Log Off", "LogOut", "Home")

где моя ошибка ??? Почему @ Html.ActionLink («Выход из системы», «Выход из системы», «Домой») выполняет действие входа в систему ????????????????????

я использую этот код для запуска этого действия LogOut в моем _Layout, и этот код работает правильно ...

 @using (Html.BeginForm("LogOut", "Home", FormMethod.Post, new { role = "form" }))
                                    {
                                        @Html.AntiForgeryToken()
                                        <input type="submit" value="خروج" class="btn btn-primary" />
                                    }

Это текст, который stackOverflow позволяет мне отправлять, потому что stackOverflow говорит, что я должен дать больше объяснений и сказать: «похоже, ваше сообщение в основном кодовое; пожалуйста, добавьте еще немного деталей» !!! у меня нет больше деталей .... я объясняю все это;)

1 Ответ

0 голосов
/ 09 июля 2019

Не помещайте ваше действие Logout в Form.Ваш ActionLink должен работать правильно, если вы дали ему правильные параметры.

Ваш ActionLink будет выглядеть следующим образом:

<a href='@Url.Action("LogOut", "Home")'>Log Out</a>

И ваш результат действия Controller будет выглядетьнапример:

public ActionResult Logout()
{
    if (Request.Cookies["user"] != null)
    {
        var user = new HttpCookie("user")
        {
            Expires = DateTime.Now.AddDays(-1),
            Value = null
        };
        Response.SetCookie(user);
        Response.Cookies.Clear();

    }
    if(Session["UserName"] != null)
    {
        Session["UserName"] = null;
        Session["IsAdmin"] = null;
    }
  //Session.Abandon();
  //Session.Clear();
  return RedirectToAction("Login", "Home");
}

Используйте RedirectPermanent, если ресурс был перемещен навсегда и больше не будет доступен в своем предыдущем местоположении.Большинство браузеров кэшируют этот ответ и выполняют перенаправление автоматически, без повторного запроса исходного ресурса.

Используйте Redirect, если ресурс может быть доступен в том же месте (URL) в будущем.Так что в вашем случае Redirect будет вариантом, так как это будет затронуто любым пользователем, выходящим из вашей системы.

Session.Abandon удаляет все объекты, хранящиеся в сеансе.Если вы не вызываете метод Abandon явно, сервер удаляет эти объекты и уничтожает сеанс по истечении времени сеанса.Он также вызывает такие события, как Session_End

Session.Clear удаляет все ключи и значения из коллекции состояния сеанса.

Подумайте об этом так: Session.Clear можно сравнить с удалением всех элементов изкорзину, в то время как Session.Abandon больше похож на отказ от самой корзины.

Вы можете использовать любой из этих двух методов для уничтожения или очистки вашей Сессии.В настоящее время вы явно делаете Clear, присваивая вашим UserName и IsAdmin значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...