Как установить значение в переменной сеанса типа словаря?

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

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

string panelOpen = SessionDictionary.GetValue("FORMDATA", "panelOpen");

public class SessionDictionary
{
    public static string GetValue(string dictionaryName, string key)
    {
        string value = string.Empty;
        try
        {
            if (HttpContext.Current.Session[dictionaryName] != null)
            {
                Dictionary<string, string> form = (Dictionary<string, string>)HttpContext.Current.Session[dictionaryName];
                if (form.ContainsKey(key))
                {
                    if (!string.IsNullOrEmpty(key))
                    {
                        value = form[key];
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Logger.Error("{0}: Error while checking Session value from Dictionary", ex, "SessionDictionary");
        }
        return value;
    }
}

Теперь я хочу написать метод для установки значения для определенного ключа сеанса, например

SessionDictionary.SetValue("FORMDATA", "panelOpen") = "First";

Теперь, если я снова перейду к приведенному ниже коду, он должен дать мне «Первый» для моей клавиши PanelOpen.

string panelOpen = SessionDictionary.GetValue("FORMDATA", "panelOpen");

Пожалуйста, предложите!


person Manoj Singh    schedule 04.02.2011    source источник
comment
Почему вы сначала делаете ContainsKey(key), а затем IsNullOrEmpty(key)? Я ожидаю, что эти тесты будут отменены.   -  person Hans Kesting    schedule 04.02.2011
comment
Будьте осторожны при использовании Dictionary в SessionState, так как он не сериализуем. Это может иметь проблемы с масштабируемостью, если вы используете SQL Persistence в своих сеансах 4854406/сериализация-словаря и support.microsoft.com/kb/311209   -  person StuartLC    schedule 04.02.2011
comment
@nonnb Требуется ли Session в ASP, чтобы объект реализовывал IXMLSerialiable? Если да, то как вообще можно хранить словарь в сеансе?   -  person El Ronnoco    schedule 04.02.2011
comment
@el ronnoco - N - сериализация требуется только в том случае, если вам нужно сохранить / гидратировать сеанс.   -  person StuartLC    schedule 05.02.2011


Ответы (1)


«SetValue» будет почти идентичным, за исключением строки value = form[key];. Это должно стать form[key] = value;.

Нет необходимости «устанавливать словарь обратно в сеанс», поскольку ссылка на тот же словарь все еще присутствует в сеансе.

Примеры:

Установка значения

public static void SetValue(string dictionaryName, string key, string value)
{
  if (!String.IsNullOrEmpty(key))
  {
    try
    {
        if (HttpContext.Current.Session[dictionaryName] != null)
        {
            Dictionary<string, string> form = (Dictionary<string, string>)HttpContext.Current.Session[dictionaryName];
            if (form.ContainsKey(key))
            {
                form[key] = value;
            }
        }
    }
    catch (Exception ex)
    {
        Logger.Error("{0}: Error while checking Session value from Dictionary", ex, "SessionDictionary");
    }
  }
}

Удаление значения:

public static void RemoveValue(string dictionaryName, string key)
{
  if (!String.IsNullOrEmpty(key))
  {
    try
    {
        if (HttpContext.Current.Session[dictionaryName] != null)
        {
            Dictionary<string, string> form = (Dictionary<string, string>)HttpContext.Current.Session[dictionaryName];
            form.Remove(key); // no error if key didn't exist
        }
    }
    catch (Exception ex)
    {
        Logger.Error("{0}: Error while checking Session value from Dictionary", ex, "SessionDictionary");
    }
  }
}
person Hans Kesting    schedule 04.02.2011
comment
Спасибо Не могли бы вы очистить это больше Нет необходимости устанавливать словарь обратно. - person Manoj Singh; 04.02.2011
comment
Можем ли мы удалить конкретный ключ из сеанса словаря, что-то вроде SessionDictionary.Remove(FORMDATA, panelOpen); - person Manoj Singh; 04.02.2011
comment
Конечно: найдите словарь, а затем используйте его метод Remove(key). - person Hans Kesting; 04.02.2011
comment
спасибо, не могли бы вы привести пример кода, используя приведенный выше код, как удалить ключ - person Manoj Singh; 04.02.2011
comment
Спасибо @Hans за вашу помощь и время! - person Manoj Singh; 04.02.2011