2011-12-25 4 views
1

私はSession["firmaid"]を私のアプリケーションでかなり使っています。この値は、誰かが自分のシステムにログインしたときに設定されます。Session ["something"]がNullReferenceExceptionをスローすると自動的にメソッドを呼び出す方法は?

何かが発生し、この値がセッションから失われた場合、私は何とかそれが取得するグローバルメソッドを持っていると思いますNullReferenceExceptionをスローします。

どうすればいいですか?

現在のところ、私の解決策は、Session["firmaid"]を使用するたびに試してみて、Exceptionを投げた場合、セッションにfirmaidを入れるメソッドを実行することです。

これを行う簡単な方法はありますか?

答えて

4

毎回try/catchする代わりに、厳密に型指定されたクラスでセッションへのアクセスをラップし、このラッパーを介してセッションにアクセスできます。

、あるいは拡張メソッド書き込み:

public static class SessionExtensions 
{ 
    public static string GetFirmaId(this HttpSessionStateBase session) 
    { 
     var firmaid = session["firmaid"] as string; 
     if (string.IsNullOrEmpty(firmaid)) 
     { 
      // TODO: call some method, take respective actions 
     }  
     return firmaid; 
    } 
} 

、その後、あなたのコードではなく、:

try 
{ 
    var firmaid = Session["firmaid"]; 
    // TODO: do something with the result 
} 
catch (Exception ex) 
{ 
    // TODO: call some method, take respective actions 
} 

使用:

var firmaid = Session.GetFirmaId(); 
// TODO: do something with the result 
+0

VSは、HttpSessionBaseを見つけることができず、インポートするものはわかりません。 HttpSessionStateBaseを意味しますか? – Kenci

+0

@Kenci、それはまさに私が意味するものです: 'HttpSessionStateBase'。 –

+0

このクラスを特別な名前空間に入れましたか? – Kenci

4

なぜ単に周りの静的なラッパーを記述しませんこの?はるかに堅牢で、よりDRY:

public static int GetFirmaid() { 
    if (HttpContext.Current.Session["firmaid"] == null) { 
    //do something to fall back 
    } 
    return HttpContext.Current.Session["firmaid"] 
} 

あなたは明らかにあなたが簡単にアクセスし、それを通じ呼び出すことができるクラスでこれを配置する必要があります:

Class.GetFirmaid() 
0

あなたが保証するアクションフィルタを作成することができますアクションは、アクションが取得するときにすでにSession["firmaid"]セットを持っています実行する前に

public class SetFirmaIdAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     try 
     { 
      var firmaId = Session["firmaid"]; 
     } 
     catch (Exception ex) 
     { 
      // pass filterContext if you need access to Request, Session etc. 
      Session["firmaid"] = SetFirmaId(filterContext); 
     } 
    } 

    private int SetFirmaId(ActionExecutingContext filterContext) 
    { 
     // TODO: implement some logic 
    } 
} 

OnActionExecutingが呼び出されます:セッション[「firmaid」]は値を持っていること実行される。

この属性を実装すると、それをアクション、コントローラー、またはグローバルとして設定できます。

関連する問題