Каков наилучший способ определить переменную сеанса null или empty в C#?



что является лучшим способом, чтобы проверить существование переменной сеанса в ASP.NET в C#?



мне нравится использовать String.IsNullOrEmpty работает для строк и задается вопросом, есть ли подобный метод для Session. В настоящее время единственный способ я знаю:



 var sSession;
if (Session["variable"] != null)
{
sSession = Session["variable"].ToString();
}
else
{
sSession = "set this";
Session["variable"] = sSession;
}
663   12  

12 ответов:

следовать из того, что сказали другие. Я, как правило, имеют два слоя:

основной слой. Это в пределах DLL, которая добавляется почти во все проекты веб-приложений. В этом у меня есть класс SessionVars, который выполняет работу grunt для геттеров/сеттеров состояния сеанса. Он содержит следующий код:

public class SessionVar
{
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
}

обратите внимание на дженерики, для получения любого типа.

затем я также добавляю геттеры / сеттеры для определенных типов, особенно строки, так как я часто предпочитаю работать со строкой.Пусто, а не null для переменных, представленных пользователям.

например:

public static string GetString(string key)
{
    string s = Get<string>(key);
    return s == null ? string.Empty : s;
}

public static void SetString(string key, string value)
{
    Set<string>(key, value);
}

и так далее...

затем я создаю обертки, чтобы абстрагироваться от этого и довести его до модели приложения. Например, если у нас есть данные клиента:

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

вы поняли правильно? :)

Примечание: просто подумал при добавлении комментария к принятому ответу. Всегда убедитесь, что объекты являются сериализуемый при хранении их в сеансе при использовании сервера состояний. Это может быть слишком легко, чтобы попытаться сохранить объект с помощью дженериков, когда на веб-ферме, и он идет бум. Я развертываю веб-ферму на работе, поэтому добавляю проверки в свой код на основном уровне, чтобы увидеть, является ли объект сериализуемым, еще одно преимущество инкапсуляции геттеров и сеттеров сеанса:)

это в значительной степени, как вы это делаете. Однако есть более короткий синтаксис, который вы можете использовать.

sSession = (string)Session["variable"] ?? "set this";

Это означает, что если переменные сеанса равны нулю, установите sSession в "set this"

Это может сделать вещи более элегантные, чтобы обернуть его в собственность.

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}

затем вы можете рассматривать его как строку.

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}

обозначение " as " в c# 3.0 очень чистое. Поскольку все переменные сеанса являются объектами с нулевым значением, это позволяет вам захватить значение и поместить его в свою собственную типизированную переменную, не беспокоясь о создании исключения. Большинство объектов могут быть обработаны таким образом.

string mySessionVar = Session["mySessionVar"] as string;

моя концепция заключается в том, что вы должны вытащить переменные сеанса в локальные переменные, а затем обработать их соответствующим образом. Всегда предполагайте, что ваши переменные сеанса могут быть null и никогда не бросать их в nullable тип.

Если вам нужна ненулевая типизированная переменная, вы можете использовать TryParse, чтобы получить это.

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}

на мой взгляд, самый простой способ сделать это, что ясно и легко читать:

 String sVar = (string)(Session["SessionVariable"] ?? "Default Value");

это может быть не самый эффективный метод, так как он приводит строковое значение по умолчанию даже в случае значения по умолчанию (приведение строки как строки), но если вы сделаете его стандартной практикой кодирования, вы обнаружите, что он работает для всех типов данных и легко читается.

например (совершенно фиктивный пример, но он показывает суть):

 DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01");
 Int NextYear = sDateVar.Year + 1;
 String Message = "The Procrastinators Club will open it's doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

мне нравятся дженерики вариант, но это кажется излишним, если вы не ожидаете, что это понадобится повсюду. Метод extensions может быть изменен для конкретного расширения объекта сеанса, чтобы он имел "безопасный" параметр get, такой как Session.StringIfNull ("SessionVar") и Session ["SessionVar"] = "myval"; это нарушает простоту доступа к переменной через Session ["SessionVar"], но это чистый код, и по-прежнему позволяет проверить, если null или если строка, если вам это нужно.

проверка на nothing / Null-это способ сделать это.

работа с типами объектов-это не выход. Объявите строгий тип и попытайтесь привести объект к правильному типу. (И использовать cast подсказку или конвертировать)

 private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }

извините за любые нарушения синтаксиса, я ежедневно глаг интерьер

обычно я создаю SessionProxy со строго типизированными свойствами для элементов в сеансе. Код, который обращается к этим свойствам, проверяет наличие nullity и выполняет приведение к правильному типу. Самое приятное в этом то, что все мои связанные с сеансом элементы хранятся в одном месте. Мне не нужно беспокоиться об использовании разных ключей в разных частях кода (и интересно, почему это не работает). И с инъекцией зависимости и издевательством я могу полностью протестировать его с помощью модульных тестов. Если следует сухим принципам, а также позволяет мне определить разумные значения по умолчанию.

public class SessionProxy
{
    private HttpSessionState session; // use dependency injection for testability
    public SessionProxy( HttpSessionState session )
    {
       this.session = session;  //might need to throw an exception here if session is null
    }

    public DateTime LastUpdate
    {
       get { return this.session["LastUpdate"] != null
                         ? (DateTime)this.session["LastUpdate"] 
                         : DateTime.MinValue; }
       set { this.session["LastUpdate"] = value; }
    }

    public string UserLastName
    {
       get { return (string)this.session["UserLastName"]; }
       set { this.session["UserLastName"] = value; }
    }
}

Я также хотел бы обернуть переменные сеанса в свойства. Сеттеры здесь тривиальны, но мне нравится писать методы get, поэтому у них есть только одна точка выхода. Для этого я обычно проверяю на null и установить его в значение по умолчанию, прежде чем возвращать значение переменной сеанса. Что-то вроде этого:

string Name
{
   get 
   {
       if(Session["Name"] == Null)
           Session["Name"] = "Default value";
       return (string)Session["Name"];
   }
   set { Session["Name"] = value; }
}

}

этот метод также не предполагает, что объект в переменной сессии является строкой

if((Session["MySessionVariable"] ?? "").ToString() != "")
    //More code for the Code God

поэтому в основном заменяет нулевую переменную пустой строкой перед преобразованием ее в строку, так как ToString является частью Object класс

Если вы знаете, что это строка, вы можете использовать строку.Функция IsEmptyOrNull ().

вы используете .NET 3.5? Создайте метод расширения IsNull:

public static bool IsNull(this object input)
{
    input == null ? return true : return false;
}

public void Main()
{
   object x = new object();
   if(x.IsNull)
   {
      //do your thing
   }
}

таким образом можно проверить есть ли такой ключ доступен

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool

Comments

    Ничего не найдено.