Каков наилучший способ определить переменную сеанса пустую или пустую в C #? - PullRequest
75 голосов
/ 24 октября 2008

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

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

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

Ответы [ 12 ]

111 голосов
/ 25 октября 2008

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

Основной слой. Это внутри библиотеки DLL, которая добавляется почти во все проекты веб-приложений . В этом у меня есть класс 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<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;
    }
}

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

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

например:

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

Вы правильно поняли идею? :)

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

17 голосов
/ 24 октября 2008

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

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

Это говорит о том, что если переменные сеанса равны нулю, установите для sSession значение "установить это"

14 голосов
/ 24 октября 2008

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

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

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

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}
8 голосов
/ 25 октября 2008

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

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

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

Если вам нужна типизированная переменная без значения NULL, вы можете использовать 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;
}
2 голосов
/ 23 августа 2011

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

 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, чтобы у него была «безопасная» опция get, такая как Session.StringIfNull ("SessionVar") и Session ["SessionVar"] = "myval"; Это нарушает простоту доступа к переменной через Session ["SessionVar"], но это чистый код, и все же позволяет проверять, если null или if string, если вам это нужно.

1 голос
/ 17 мая 2016

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

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

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

1 голос
/ 25 октября 2008

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

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

}

1 голос
/ 25 октября 2008

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

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; }
    }
}
1 голос
/ 24 октября 2008

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

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

 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

0 голосов
/ 08 октября 2018

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

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...