0

我正在编写一个帐户管理控制器,并且必须单独处理删除自己用户的帐户:

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

还有其他想法吗?谢谢!

4

3 回答 3

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") %> ]
<% } %>
于 2009-06-02T19:24:55.053 回答
0

Delete行动中,而不是return View("DeleteSelf"),试试这个return Redirect("DeleteSelf")

于 2009-06-02T10:12:16.433 回答
0

我检查了标准 AccountController.cs 文件的源代码,发现了两种方法

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

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

仅显示相应的视图。所以我的

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

在这样的公司,方法看起来不错。虽然我应该更改名称以保持一致性。

于 2009-06-02T11:09:03.637 回答