Очистить значение Request.IsAuthenticated после SignOut () без RedirectToAction () - PullRequest
0 голосов
/ 02 июня 2009

Я пишу контроллер управления учетной записью и должен отдельно обработать удаление учетной записи собственного пользователя:

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(string userName, string confirmButton)
{
    MembershipService.DeleteUser(userName);

    if (User.Identity.Name.Equals(userName,
        StringComparison.InvariantCultureIgnoreCase))
    {
        FormsAuth.SignOut();

        return View("DeleteSelf");
    }
    else
        return RedirectToAction("Index");
}

Но при частичном представлении LogOnUserControl.ascx по-прежнему показывает только что вышедшее из системы имя пользователя при отображении представления DeleteSelf, поскольку значения Request.IsAuthenticated и Page.User.Identity по-прежнему установлены после FormsAuth.SignOut ().

Добавление нового действия ShowDeleteSelfMessage может решить проблему, но мне не нравится это решение:

    ...
    {
        FormsAuth.SignOut();

        return RedirectToAction("ShowDeleteSelfMessage");
    }
    ...

public ActionResult ShowDeleteSelfMessage()
{
    return View("DeleteSelf");
}

Есть еще идеи? Спасибо!

Ответы [ 3 ]

1 голос
/ 02 июня 2009

Измените свой LogOnUserControl.ascx для работы с ViewData ["UserDeleted"]:

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(string userName, string confirmButton)
{
    MembershipService.DeleteUser(userName);

    if (User.Identity.Name.Equals(userName,
        StringComparison.InvariantCultureIgnoreCase))
    {
        FormsAuth.SignOut();

        // ***
        ViewData["UserDeleted"] = true;
        // ***

        return View("DeleteSelf");
    }
    else
        return RedirectToAction("Index");
}

LogOnUserControl.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<% if (Request.IsAuthenticated && !(ViewData["UserDeleted"] ?? false)) { %>
    Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
    [ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> ]
<% } else { %> 
    [ <%= Html.ActionLink("Log On", "LogOn", "Account") %> ]
<% } %>
0 голосов
/ 02 июня 2009

Я изучил исходный код стандартного файла AccountController.cs и нашел два метода

public ActionResult ChangePasswordSuccess()
{
    return View("ChangePasswordSuccess");
}

и

public ActionResult RestorePasswordSuccess()
{
    return View("RestorePasswordSuccess");
}

, которые показывают только соответствующие виды. Так что мой

public ActionResult ShowDeleteSelfMessage()
{
    return View("DeleteSelf");
}

метод будет хорошо смотреться в такой компании. Хотя я должен изменить название для согласованности.

0 голосов
/ 02 июня 2009

В Delete действии, вместо return View("DeleteSelf"), попробуйте это return Redirect("DeleteSelf")

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