2009-06-02 4 views
0

Je suis en train d'écrire un contrôleur de gestion de compte et doivent traiter la suppression du compte propre utilisateur séparément:Effacer la valeur Request.IsAuthenticated après SignOut() sans RedirectToAction()

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

Mais vue partielle LogOnUserControl.ascx montre encore juste déconnecté le nom d'utilisateur lors de l'affichage de la vue DeleteSelf, car les valeurs Request.IsAuthenticated et Page.User.Identity sont toujours définies après FormsAuth.SignOut().

Ajout d'une nouvelle ShowDeleteSelfMessage d'action pourrait résoudre le problème, mais je n'aime pas cette solution:

... 
    { 
     FormsAuth.SignOut(); 

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

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

D'autres idées? Je vous remercie!

Répondre

1

Changer votre LogOnUserControl.ascx pour traiter 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

Dans l'action Delete, au lieu de return View("DeleteSelf"), essayez cette return Redirect("DeleteSelf")

+0

J'ai essayé et appris ce que cela est malheureusement équivalent à RedirectToAction ("DeleteSelf ") –

+0

N'est-ce pas différent de votre OP, qui est de retour Voir (" DeleteSelf ")? –

+0

Malheureusement, la même chose. Mais je pense maintenant qu'ajouter une action séparée pour montrer une vue est un modèle commun. –

0

J'ai examiné le code source de fichier standard AccountController.cs et a trouvé deux méthodes

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

et

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

qui n'affiche que les vues correspondantes. Donc, mon

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

la méthode semblera bonne dans une telle société. Bien que je devrais changer le nom pour la cohérence.

Questions connexes