2016-04-06 7 views
1

In meiner MVC5-Anwendung habe ich Account-basierte Login-System. Wenn sich der Benutzer bei seinen Accounts anmeldet, müssen wir die Datenbank nach Master-Informationen abfragen und sie irgendwo in der Anwendung speichern. Weil wir das auf jeder Seite verwenden müssen. Also habe ich zunächst Session verfolgt, um die Informationen zu speichern. Aber ich möchte wissen, Gibt es eine bessere Option, um die Daten zu behandeln.Besserer Weg, um die Global Account Details und Master-Informationen in MVC zu behandeln

Weitere klar ich die Stammdaten wie Standard Asp.Net User Identity behandeln möchten, dass wir

User.Identity.IsAuthenticated 

Für zB verwenden: nun wie folgt mit im,

Klassendatei

public class MyClassProperty 
{ 
    public int Id {get;set;} 
    public int Value {get;set;} 
} 

-Controller

List<MyClassProperty> obj = context.MyMaster.Tolist(); 
Session["MyClassProperty"]=obj; 

Ansichten

@{var obj =(List<MyClassProperty>)Session["MyClassProperty"];} 
@obj.Id 
@obj.Value 

Aber ich möchte in Sicht oder anderen Controllern wie diese Daten zugreifen

@MyClassName.MyClassProperty.Id 

Kann jemand mir empfehlen, diese zu lösen.

Wenn die Frage nicht klar ist, bitte Kommentar.

+0

Die Klasse "information" wurde an eine Modellklasse angehängt und an Ihre Ansicht übergeben (und möglicherweise an andere Controller, obwohl sie in der Lage sein sollten, sie einfach aus der Sitzung/dem Cache zu holen). – jleach

+0

Nur um klar zu sein, verwenden Sie nicht asp.net Identität? – Mark

Antwort

0

Ich habe gerade ein ziemlich umfangreiches bisschen Forschung über verschiedene Möglichkeiten, um mit dieser Art von Informationen umzugehen, und meine Mitnahme war, dass die Daten in einer Datenbank erhalten, ein Modell zu geben und speichern "Live" -Werte in der Session ist wahrscheinlich der flexibelste Weg, um damit umzugehen, ohne dass Sie Ihre eigene Logik für das Caching schreiben müssen. Die einzige Sache, auf die ich besonders achten sollte, ist zu versuchen, die Größe/den Footprint dieser Daten klein zu halten, da die Sitzung die Speicher leicht auffressen kann.

In Bezug auf die eingebaute Profil/Identity-Management, ja, können Sie das und das allein, um viel davon zu behandeln, aber ich habe festgestellt, dass es nicht ganz flexibel (oder wenn es ist, ist es nicht leicht flexibel) und das Viele der Daten, die ich verfolgen würde, sind spezifischer für die Domäne und nicht für die MVC/Präsentationsschicht selbst. Indem wir also eine Datenbank verwenden, um alle "Extra" -Infos zu speichern, bleiben wir bei MVC und haben mehr Flexibilität.

Um diese Informationen Ihrer Sicht zugänglich zu machen, sollten Sie sie an eine Viewmodel-Klasse irgendeiner Art anhängen. Hier ist die Grundidee:

// the core model for the user info 
public class UserProfile { 
    public int SomeValue {get;set;} 
} 

// a viewmodel for some specific view: 
public class MyViewModel : DomainObject { 
    public UserProfile UserProfile {get;set;} 
} 

// from your controller: 
public ActionResult MyAction() { 
    var model = repository.GetMyViewModel(); 
    model.UserProfile = Session["UserProfile"] as UserProfile; 
    return View(model); 
} 

(ok, so sollte das Repository wahrscheinlich für den Umgang mit der Zuordnung der Userprofile Informationen sowie die Kern Ansicht des Modells verantwortlich sein, aber das macht für eine einfache Demonstration).

+0

Ich denke, dass jeder, der ernsthaft über diese Antwort nachdenkt, zuerst lesen sollte [Denken Sie zweimal daran, den Sitzungsstatus zu verwenden] (http://brockallen.com/2012/04/07/think-twice-about-using-session-state/) . Es * ausdrücklich * gibt an, dass Profilinformationen nicht in Sitzung sein sollten und gibt mehrere Gründe, warum dies kein guter Ansatz ist, insbesondere für moderne AJAX-Anwendungen. Was immer Sie tun müssen, um die ASP.NET Identity-Profilfunktionalität zum Laufen zu bringen, ist definitiv das skalierbarere und reaktionsfähigere Ergebnis wert. – NightOwl888

Verwandte Themen