Сеансы ASP.net, ссылки или нет? .. а как написать сессию со списком? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть это свойство в моем коде:

public List<TreeViewNodeContentHolder> NodeContentHolder
    {
        get
        {
            if (Session["NodeContainerSession"] == null)
            {
                var tempSessionVar = new List<TreeViewNodeContentHolder>();
                Session["NodeContainerSession"] = tempSessionVar;
                return (List<TreeViewNodeContentHolder>)Session["NodeContainerSession"];
            }
            else
                return (List<TreeViewNodeContentHolder>)Session["NodeContainerSession"];
        }
    }

и я хочу добиться того, чтобы я мог добавлять объекты и выполнять linq-запрос к списку / сеансу. Поэтому я бы хотел написать что-то вроде:

NodeContentHolder.Add(new TreeViewNodeContentHolder{prop1=1,prop2=2});

Я также хочу иметь возможность сделать это:

var someNode = NodeContentHolder.Where(e=>e.prop1 == x).FirstOrDefault();

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

someNode.prop1 = 12345;

??

Или я должен сначала «вытащить» объект, а затем удалить его из списка / сеанса, а затем добавить обратно, чтобы убедиться, что он обновляется?

Заранее спасибо!

1 Ответ

0 голосов
/ 03 февраля 2012

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

Единственное, что я изменю в вашем коде, это if Session["NodeContainerSession"] != null, не означавшее, что это также List<TreeViewNodeContentHolder>, это проверка, которую вы должны выполнить.

public List<TreeViewNodeContentHolder> NodeContentHolder
{
    get
    {
        object oSessionNode = Session["NodeContainerSession"] as List<TreeViewNodeContentHolder>;

        if (oSessionNode == null)
        {
            oSessionNode = new List<TreeViewNodeContentHolder>();
            Session["NodeContainerSession"] = oSessionNode;
        }

        return (List<TreeViewNodeContentHolder>)oSessionNode;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...