2017-01-17 34 views
0

私はasp.net MVC 5プロジェクトで厳密に型付けされたセッション変数を実装しようとしています。私はthis SO articleを見つけましたが、これは私のものですが、拡張機能の知識が不足しているために私が慣れていないいくつかのエラーがあります。拡張メソッドのスローエラー

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; 
    } 
} 

簡単にコードビハインドでの全体のオブジェクトを割り当てることができます:

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

このすべてが素晴らしい働いている。ここ

SessionExtensionsクラスです。私が持っている問題/エラーは、セッションからUserオブジェクトを取得しようとするときです。 TryGetAuthenticatedValue拡張メソッドが表示されますが、自分の.cshtmlで使用しようとするとエラーが発生します。

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

エラーがProject1.Models.Userに設計時であり、それはそれは私がEF 6を使用していますし、UserクラスはEFによって自動生成されていることは注目に値するかもしれ'User' is a type, which is not valid in the given context.'

を述べています。

.cshtmlファイルの拡張方法が間違っていますか、それとも何か不足していますか?

私はあなたがあなたのビューでコードを変更する必要があると思う
+0

'Project1.Models.User'はクラスです。あなたのメソッドはそれが型を渡すことを期待していますか? – Shyju

+0

'TryGetAuthenticatedValue'は' out'変数を使います。次のようなことをする必要があります: 'Project1.Models.User usr; if(Session.TryGetAuthenticatedValue(out usr)&& usr!= null)... ' –

+0

OutパラメータとしてProject1.Models.UserクラスのオブジェクトをSession.TryGetAuthenticatedValueメソッドに渡す必要があります。あなたが渡しているのはクラスであり、オブジェクトではありません。 –

答えて

2

:あなたはnullをチェックする必要はありませんし、あなたがの変数に渡す必要がブール値を返すTryGetAuthenticatedValue方法ので

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

タイプ自体ではなく、取得するタイプ。

希望に役立ちます!

+0

あなたが 'out user'を使っているのであれば、最初に' null'を割り当てる必要はありません。 –

+0

ええ、私は知っていますが、私は値に関係なく値を初期化する習慣にしています。 – MikeS

+0

小さなものでなければならないことが分かっていました。助けてくれてありがとう! – Robert