2009-06-02 3 views
0

Я пишу контроллер управления учетными записями и должны обрабатывать удаление учетной записи собственного пользователя отдельно:значение Clear Request.IsAuthenticated после SignOut() без 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"); 
} 

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

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

... 
    { 
     FormsAuth.SignOut(); 

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

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

Любые другие идеи? Спасибо!

ответ

1

Изменение 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

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

+0

Я попытался и узнал, что, к сожалению, это эквивалентно RedirectToAction ("DeleteSelf ") –

+0

Разве это не отличается от вашего OP, который является возвратом View (« DeleteSelf »)? –

+0

К сожалению, то же самое. Но теперь я думаю, что добавление отдельного действия для отображения представления является общим шаблоном. –

0

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

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

и

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

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

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

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

Смежные вопросы