Pergunta

Eu estou escrevendo um controlador de gestão de contas e tem que apagar processo de conta própria do usuário separadamente:

[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");
}

Mas a visão parcial LogOnUserControl.ascx ainda mostra apenas desconectado nome de usuário durante a exibição de vista DeleteSelf porque os valores Request.IsAuthenticated e Page.User.Identity ainda estão definido após FormsAuth.SignOut ().

Adicionar um novo ShowDeleteSelfMessage ação poderia resolver o problema, mas eu não gosto dessa solução:

    ...
    {
        FormsAuth.SignOut();

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

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

Quaisquer outras ideias? Obrigado!

Foi útil?

Solução

Mude o seu LogOnUserControl.ascx para lidar com 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") %> ]
<% } %>

Outras dicas

Na ação Delete, em vez de return View("DeleteSelf"), tente este return Redirect("DeleteSelf")

Eu examinei o código fonte do arquivo AccountController.cs padrão e encontrou dois métodos

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

e

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

que só mostram vistas correspondentes. Assim, a minha

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

método vai ficar bem em tal companhia. Embora eu deveria mudar o nome para a consistência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top