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

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

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

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

Чтобы следить за тем, что говорили другие. Я имею тенденцию иметь два слоя:

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

 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(string key) { if (Session[key] == null) return default(T); else return (T)Session[key]; } public static void Set(string key, T value) { Session[key] = value; } } 

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

Затем я также добавляю Getters / Setters для определенных типов, особенно string, потому что часто предпочитаю работать с string.Empty, а не null для переменных, представленных пользователям.

например:

 public static string GetString(string key) { string s = Get(key); return s == null ? string.Empty : s; } public static void SetString(string key, string value) { Set(key, value); } 

И так далее…

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

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

Вы правильно поняли? 🙂

ПРИМЕЧАНИЕ. Просто придумал комментарий к принятому ответу. Всегда гарантируйте, что объекты могут быть сериализованы при хранении в сеансе при использовании государственного сервера. Слишком легко попытаться сохранить объект, используя генерики, когда на веб-ферме, и он идет бум. Я развертываю на веб-ферме на работе, поэтому добавленные проверки на мой код в основном слое, чтобы узнать, является ли объект сериализуемым, еще одно преимущество инкапсуляции сессионных Getters и Setters 🙂

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

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

Это говорит, что если переменные сеанса равны нулю, установите sSession для «установки этого»,

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

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

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

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

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

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

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

Если вам нужна переменная, не имеющая значения NULL, вы можете использовать TryParse для ее получения.

 int mySessionInt; if (!int.TryParse(mySessionVar, out mySessionInt)){ // handle the case where your session variable did not parse into the expected type // eg 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); 

Мне нравится опция Generics, но это кажется излишним, если вы не ожидаете этого во всем. Метод расширения может быть изменен, чтобы специально расширить объект Session, чтобы он имел «безопасный» вариант получения, такой как Session.StringIfNull («SessionVar») и Session [«SessionVar»] = «myval»; Это нарушает простоту доступа к переменной через Session [“SessionVar”], но это чистый код и по-прежнему позволяет проверить, является ли null или если строка, если вам это нужно.

Проверка на что-либо / Null – это способ сделать это.

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

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

Извините за любые нарушения синтаксиса, я ежедневный VB’er

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

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

}

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

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

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

Если вы знаете, что это строка, вы можете использовать функцию String.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 } } 
  • Не удалось инициализировать прокси - нет сеанса
  • Сохранение сеанса ASP.NET Open / Alive
  • Обмен данными сеанса между контекстами в Tomcat
  • Отправить команду на уже запущенный сеанс экрана
  • Будет ли Hibernate очищать мой обновленный постоянный объект при вызове session.close () с помощью FlushMode.AUTO?
  • Как использовать сеанс на страницах JSP для получения информации?
  • Управление данными сеанса Webapp / streamом controllerа для нескольких вкладок
  • Невозможно сериализовать состояние сеанса
  • Классический ASP: несколько ASPSESSIONID в файлах cookie
  • HttpContext.Current.Session имеет значение null в файле Ashx
  • Когда Hibernate сбрасывает сеанс, как он решает, какие объекты в сеансе загрязнены?
  • Interesting Posts
    Давайте будем гением компьютера.