web-dev-qa-db-ja.com

セッション変数が存在するかどうかを検出できません

Session変数が存在するかどうかを確認しようとしていますが、エラーが発生します。

System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

コード:

    // Check if the "company_path" exists in the Session context
    if (System.Web.HttpContext.Current.Session["company_path"].ToString() != null)
    {
        // Session exists, set it
        company_path = System.Web.HttpContext.Current.Session["company_path"].ToString();
    }
    else
    {
        // Session doesn't exist, set it to the default
        company_path = "/reflex/SMD";
    }

これは、Session名「company_path」が存在しないため、検出できません。

12
Luke

Session ["company_path"]がnullかどうかを確認する場合は、ToString()を使用しないでください。 As if Session["company_path"] is null then Session["company_path"].ToString() will give you exception.

変更

if (System.Web.HttpContext.Current.Session["company_path"].ToString() != null)
{
    company_path = System.Web.HttpContext.Current.Session["company_path"].ToString();
}
else
{
    company_path = "/reflex/SMD";
}

To

if (System.Web.HttpContext.Current.Session["company_path"]!= null)
{
      company_path = System.Web.HttpContext.Current.Session["company_path"].ToString();
}
else
{
      company_path = "/reflex/SMD";
}
27
Adil

これは、null条件付き?.とnull-coalesce ??を使用して、最新バージョンの.NETで1つのライナーとして解決できます。

// Check if the "company_path" exists in the Session context
company_path = System.Web.HttpContext.Current.Session["company_path"]?.ToString() ?? "/reflex/SMD";

リンク:

https://docs.Microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operatorhttps://docs.Microsoft.com/ en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

1
Luke

Azureにデプロイする場合(2017年8月現在)、セッションキー配列が入力されているかどうかも確認すると便利です。例:

Session.Keys.Count > 0 && Session["company_path"]!= null
0
Manish