Подтвердить что ты не робот

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

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

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

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

Ответ 1

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

Основной слой. Это находится в 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 для определенных типов, особенно string, поскольку часто предпочитаю работать с string.Empty, а не 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);
        }
    }
}

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Если вам нужна переменная с типом, не подлежащая обнулению, вы можете использовать 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;
}

Ответ 5

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

 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 doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

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

Ответ 6

Проверка на отсутствие /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

Ответ 7

Обычно я создаю 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; }
    }
}

Ответ 8

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

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

}

Ответ 9

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

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

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

Ответ 10

Используете ли вы .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
   }
}

Ответ 11

Если вы знаете строку, вы можете использовать функцию String.IsEmptyOrNull().