C# asp.net MVC3: Methode in jeder Controller-Methode automatisch aufrufen

mosquito87

Lieutenant
Registriert
Aug. 2006
Beiträge
980
Hallo zusammen,

ich arbeite zurzeit an einer asp.net MVC Webapplikation und baue das "Gerüst" dafür.
Meine Controller will ich so schlank wie möglich gestalten.

In allen Methoden der meisten Controller, die ein ActionResult (also eine View z. B.) zurückgeben, ist es so, dass diese folgendermaßen gestaltet sind:

Code:
try
            {
                //Prüfen ob Nutzer eingeloggt ist
                new UserController().isLoggedIn(HttpContext);

                //Nachrichten abrufen
                this.getMessages();

                return View();
            }
            catch (ForceLoginException exc)
            {
                this.setFehlermeldung(exc.Message);
                return RedirectToAction("Index", "Home");
            }
            catch (Exception exc)
            {
                this.setFehlermeldung(exc.Message);
                return RedirectToAction("Index", "Home");
            }

Code:
new UserController().isLoggedIn(HttpContext);
wirft dabei eine Exception, falls der User nicht eingeloggt ist. Diese (ForceLoginException) wird dann gefangen und der User an die Hauptseite weitergeleitet.

Wie kann ich dieses "Konstrukt" auslagern? Wie mache ich die Sache schlanker?
Momentan muss ich dieses Konstrukt in JEDER Methode implementieren.

Ich dachte zuerst an den Konstruktor, doch hier sind keine redirects (bzw. returns) möglich ...

Jemand ne Idee?
 
Der Konstruktor könnte eine Methode aufrufen, die ein ActionResult zurück gibt. Diese Methode könnte in einer zentralen Basisklasse implementiert sein. Ob Du das statisch oder mit Hilfe von Vererbung löst, mußt Du entscheiden.

Wie löst Du denn den Login? Es wird doch ein schönes Beispiel für das SessionHandling in dem Beispielprojekt der Vorlage mitgeliefert. Wenn die Session steht, braucht man doch eigentlich nicht ständig den Login prüfen. Oder kann Deinem Benutzer das Zugriffsrecht auf die Webanwendung während der Session entzogen werden?
 
Zuletzt bearbeitet:
Du könntest dir eine statische Methode bauen die dass für dich erledigt.

Sprich:
Code:
    public static class MyControllerLogic
    {
        public static ViewResult CreateView(Func<ViewResult> func)
        {
            //dein Try Catch zeug
            return func(); //statt "return View()" - Erklärung unten
        }
    }

statt deines return View(); im Controller rufst du dann immer folgendes auf:

Code:
return MyControllerLogic.CreateView(() => { return View(); });

Zur Erklärung:
Func<ViewResult> bedeutet dass er quasi eine Methode erwartet welche ein ViewResult zurück gibt und keine Parameter erwartet.
Beim aufruf bedeutet () dass keine Parameter übergeben werden.
Nach dem => kommt der Code der ausgeführt wird.
In diesem Fall das gewünschte return View();.
Wobei die Methode "View()" ein ViewResult zurück gibt wie wir angegeben haben.
 
Zuletzt bearbeitet von einem Moderator: (Kommentiert)
Zurück
Oben