2017-01-17 3 views
0

Ich versuche, stark typisierte Sitzungsvariablen in meinem asp.net MVC 5 Projekt zu implementieren. Ich habe this SO article gefunden, auf die ich mich stütze, habe aber einige Fehler, die ich aufgrund meines Mangels an Erweiterungen nicht kenne.Extension Methode werfen Fehler

Hier ist die SessionExtensions Klasse:

public static class SessionExtensions 
{ 
    public static bool TryGetValue<T>(this HttpSessionStateBase session, out T value) 
     where T : class 
    { 
     var name = typeof(T).FullName; 

     value = session[name] as T; 

     var result = value != null; 

     return result; 
    } 

    public static void SetValue<T>(this HttpSessionStateBase session, T value) 
    { 
     var name = typeof(T).FullName; 

     session[name] = value; 
    } 

    public static void RemoveValue<T>(this HttpSessionStateBase session) 
    { 
     var name = typeof(T).FullName; 

     session[name] = null; 
    } 

    public static bool ValueExists(this HttpSessionStateBase session, Type objectType) 
    { 
     var name = objectType.FullName; 

     var result = session[name] != null; 

     return result; 
    } 

    public static bool TryGetAuthenticatedValue<T>(this HttpSessionStateBase session, 
     out T value) 
     where T : class 
    { 
     value = null; 

     if (HttpContext.Current.User != null 
      && HttpContext.Current.User.Identity != null 
      && HttpContext.Current.User.Identity.IsAuthenticated) 
     { 
      var name = typeof(T).FullName; 

      value = session[name] as T; 
     } 

     var result = value != null; 

     return result; 
    } 
} 

die leicht ganze Objekte in Code-behind zuordnen:

DBRepository repo = new DBRepository(); 
var user = repo.GetAppUserInformation(userId); 
Session.SetValue(user); 

All diese große funktioniert. Das Problem/der Fehler, den ich habe, ist, wenn ich versuche, das User Objekt aus der Sitzung abzurufen. Ich sehe die Erweiterungsmethode TryGetAuthenticatedValue, aber wenn ich versuche, es in meinem .cshtml zu verwenden, erhalte ich einen Fehler.

<span class="username"> 
    @{ 
     if(Session.TryGetAuthenticatedValue(Project1.Models.User) != null) 
     { 
      //Display username from Session object. 
     } 
    } 
</span> 

Der Fehler ist zur Entwurfszeit auf Project1.Models.User und es heißt 'User' is a type, which is not valid in the given context.'

Es kann sich lohnen, unter Hinweis darauf, dass ich mit EF 6 und die User Klasse ist automatisch generiert von EF.

Ich verwende die Extension-Methode falsch in der .cshtml-Datei oder fehlt noch etwas?

+0

'Project1.Models.User' ist eine Klasse. Erwartet Ihre Methode, dass ein Typ übergeben wird? – Shyju

+0

'TryGetAuthenticatedValue' verwendet eine 'out'-Variable. Sie müssen etwas tun wie: 'Project1.Models.User usr; if (Session.TryGetAuthenticatedValue (aus usr) && usr! = null) ... ' –

+0

Sie müssen ein Objekt der Project1.Models.User-Klasse als out-Parameter an die Session.TryGetAuthenticatedValue-Methode übergeben. Was du passierst, ist Klasse, kein Objekt. –

Antwort

2

Ich glaube, Sie brauchen, um den Code in Ihrer Ansicht zu ändern:

<span class="username"> 
    @{ 
     Project1.Models.User user = null; 
     if(Session.TryGetAuthenticatedValue(out user)) 
     { 
      //Display username from Session object. 
     } 
    } 
</span> 

Da das Verfahren TryGetAuthenticatedValue eine Bool zurückgibt müssen Sie nicht für null zu überprüfen, und Sie müssen in einer Variablen zu übergeben von der Typ, den Sie abrufen möchten, nicht den Typ selbst.

Hoffe, dass hilft!

+0

Nur zur Info, wenn Sie 'out user' verwenden, müssen Sie ihm nicht zuerst 'null' zuweisen. –

+0

Ja, ich weiß, aber ich mache es mir zur Gewohnheit, Werte unabhängig zu initialisieren. – MikeS

+0

Wusste es musste etwas klein sein. Danke für die Hilfe! – Robert