2 Stimmen

Überschreiben des RenderBody-Inhalts ohne Benutzerweiterleitung in MVC3

Ich habe versucht, dies zu tun:

                @{ Html.RenderAction("MenuPartial", "MenuPartial"); }

            @if (SessionWrapper.IsAuthenticated)
            {
                @RenderBody()
            }
            else
            {
                Html.RenderPartial("AccessDeniedPartial");
            }

Aber natürlich ist das nicht erlaubt, da ich @RenderBody() haben muss, oder es tritt eine Ausnahme auf. Das Problem ist, dass diese Lösung so ordentlich gewesen wäre, ich möchte immer noch den oberen Teil der Seite rendern, aber ich möchte den Inhalt überschreiben, es sei denn, der Benutzer ist angemeldet.

Die einzige andere Lösung, die mir einfällt, ist die Prüfung im Controller durchzuführen und eine andere Ansicht zurückzugeben. Das Problem dabei ist, dass ich diesen Code in jedem Controller wiederholen müsste, was mich traurig macht.

Gibt es eine Möglichkeit, den Inhalt global zu überschreiben, ähnlich wie oben, ohne den Benutzer auf eine andere URL umzuleiten? Wenn ja, könnten Sie mich bitte in die richtige Richtung lenken. Ich scheine in meiner aktuellen Denkweise ein wenig festzustecken.

Ich verwende nicht die Standard-Microsoft-Sicherheitsklassen (FormsAuthentication), noch bin ich in diesem Fall in der Lage dazu.

Danke.

1voto

nickvane Punkte 2919

Erstellen Sie eine AccessDenied Ansicht im Ansichten/Shared Ordner, die den gleichen Inhalt wie Ihr AccessDeniedPartial hat. Lassen Sie das RenderBody wie es ist:

    @RenderBody()

Erstellen Sie ein LogOnAuthorizeAttribute, das die Authentifizierung überprüft und andernfalls die AccessDenied-Ansicht anzeigt.

public class LogOnAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!SessionWrapper.IsAuthenticated)
        {
            filterContext.Result = new ViewResult {ViewName = "AccessDenied"};
        }
        else
        {
            base.OnAuthorization(filterContext);
        }
    }
}

Wenn Sie möchten, dass das LogOnAuthorizeAttribute zu jedem Controller hinzugefügt wird, fügen Sie es als Filter der GlobalFilterCollection in der Global.asax hinzu.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new LogOnAuthorizeAttribute());
}

0voto

Softlion Punkte 11804

Die einzige andere Lösung, die mir einfällt, ist, die Überprüfung im Controller durchzuführen und eine andere Ansicht zurückzugeben.

Ja, mach das.

Das Problem dabei ist, dass ich diesen Code in jedem Controller wiederholen müsste, was mich traurig macht.

Nein, wenn Sie das neue aspektorientierte Programmiermodell von MVC verwenden, das auf Filterattributen basiert. Überprüfen Sie das AuthorizeAttribute und das Filtermodell von ASP.NET MVC.

[Authorize]
public ViewResult MyAction(...)

Sie können das Verhalten dieses Authorize-Attributs ganz einfach anpassen.

Erfahren Sie außerdem mehr über aspektorientierte Programmierung hier: http://en.wikipedia.org/wiki/Aspect-oriented_programming

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X