RedirectToActionせずにクリアサインアウト後のRequest.IsAuthenticated値()()

StackOverflow https://stackoverflow.com/questions/938764

質問

私は、アカウント管理コントローラを書き込み、別に自分のユーザーのアカウントの削除を処理しなければならいます:

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

しかしRequest.IsAuthenticatedとPage.User.Identity値はまだFormsAuth.SignOut()。

の後に設定されているためDeleteSelfビューを表示しながら部分ビューLogOnUserControl.ascxはまだユーザー名をログアウトだけを示し

新しいアクションShowDeleteSelfMessageを追加すると、問題を解決することができますが、私はこのソリューションを好きではない:

    ...
    {
        FormsAuth.SignOut();

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

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

他のアイデア?ありがとうございます!

役に立ちましたか?

解決

のViewData [ "UserDeleted"]に対処するためにあなたのLogOnUserControl.ascxを変更します:

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

他のヒント

Deleteアクションでは、代わりにreturn View("DeleteSelf")の、このreturn Redirect("DeleteSelf")を試してみてください。

私は標準AccountController.csファイルのソースコードを検査し、発見した二つの方法

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

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

のみ対応図を示しています。だから私の

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

この方法は、そのような会社では良い見ていきます。私は一貫性のために名前を変更する必要がありますけど。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top