Pregunta

Estoy escribiendo un controlador de gestión de cuentas y tengo que procesar borrado de la cuenta propia del usuario por separado:

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

Pero vista parcial LogOnUserControl.ascx sigue mostrando simplemente registra el nombre del usuario al tiempo que muestra la vista DeleteSelf porque los valores Request.IsAuthenticated y Page.User.Identity todavía se fijan después FormsAuth.SignOut ().

La adición de un nuevo ShowDeleteSelfMessage acción podría resolver el problema, pero no me gusta esta solución:

    ...
    {
        FormsAuth.SignOut();

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

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

¿Alguna otra idea? Gracias!

¿Fue útil?

Solución

Cambiar su LogOnUserControl.ascx para hacer frente a 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") %> ]
<% } %>

Otros consejos

En la acción Delete, en lugar de return View("DeleteSelf"), probar este return Redirect("DeleteSelf")

He examinado el código fuente del archivo AccountController.cs estándar y encontrado dos métodos

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

y

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

que sólo muestran vistas correspondientes. Así que mi

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

método se verá bien en dicha compañía. Aunque me sea necesario cambiar el nombre de la coherencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top