MVC3 Razor Engine порядок исполнения / рендеринга - PullRequest
1 голос
/ 23 мая 2011

У меня есть несколько ссылок (вход в систему, выход из системы и регистрация) в шаблоне _layout, где ссылки отображаются в зависимости от того, вошел ли пользователь в систему. Например:

if (User.Identity.IsAuthenticated)
{
    <span class="username">@User.Identity.Name</span>
    <span class="link">@Html.ActionLink("Logout", "Logout", "Account")</span>
}
else
{
    <span class="link">@Html.ActionLink("Login", "Login", "Account")</span>
    <span class="link">@Html.ActionLink("Register", "Register", "Account")</span>
}

Проблема в том, что ссылка для выхода из системы по-прежнему отображается при первом выходе пользователя из системы (я ожидаю, что он будет немедленно заменен именем входа и зарегистрированными ссылками), то есть до тех пор, пока страница не будет обновлена ​​или пока пользователь переходит на другую страницу. Вот код выхода из системы:

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    Session.Abandon();

    return View();
}

Я прошел по этой ссылке - http://mvcdev.com/differences-between-asp-net-razor-and-web-forms-view-engines/ - которая объясняет порядок выполнения движка Razor, но в моем случае, похоже, он выполняется по-другому. В идеале я ожидал бы, что FormsAuthentication.SignOut () будет выполняться до User.Identity.IsAuthenticated в _layout.

Что я делаю не так? Спасибо!

1 Ответ

3 голосов
/ 23 мая 2011

Это нормально, вам нужно перенаправить после выхода из системы:

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    Session.Abandon();

    return RedirectToAction("Index");
}

Причина, по которой это происходит, заключается в том, что, когда клиент запросил ссылку выхода из системы, он все еще проходил проверку подлинности (он отправил файл cookie для проверки подлинности вместе с запросом).Затем внутри действия контроллера вы выходите из него (FormsAuthentication.SignOut()), который делает только отметку файла cookie для аутентификации для удаления по последующим запросам.Затем вы возвращаете представление, и внутри этого представления, конечно же, пользователь все еще аутентифицируется, поскольку это представление выполняется по тому же запросу, и cookie все еще присутствует.

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