Удаление выбранных элементов сеанса (VB ASP.NET )

#asp.net #vb.net #session

#asp.net #vb.net #сеанс

Вопрос:

Я работаю над чем-то, что требует хранения различных данных сеанса.

Мне нужно иметь возможность удалять определенные данные из сеанса, но не очищать все это.

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

 Session.Remove("itemName")
  

Мой вопрос в том, можно ли сделать что-то вроде установки префикса для всех переменных сеанса, а затем удалить все переменные с этим префиксом?

 useData = session("snippet_theData")
  

и затем что-то, что делает

 Session.Remove("snippet_*")
  

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

Ответ №1:

Наиболее прямым способом было бы выполнить итерацию по коллекции сеансов и использовать либо простое сопоставление строк ( string.StartsWith ), либо регулярное выражение (перебор, если ваши идентификаторы действительно такие простые, как snippet_ ), и либо использовать Session.Remove() для удаления элемента, либо установить его значение равным null или пустой строке.

Ответ №2:

Спасибо всем… Боюсь, что вышеприведенное не совсем сработало, я использую VB, и из ошибок, которые я получал, мне показалось, что описанные выше методы будут работать на C #, но не сработали с VB.

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

     Dim Key As String
    Dim prefix As String = "prefix_"
    Dim deleteKeyArray As Array
    Dim i As Integer
    Dim deleteKeys As String

    For Each Key In Session.Keys
        If Key.StartsWith(prefix) Then _
            deleteKeys = Key amp; "," amp; deleteKeys
    Next

    deleteKeyArray = Split(deleteKeys, ",")
    For i = 0 To UBound(deleteKeyArray)
        Session.Remove(deleteKeyArray(i))
    Next
  

Кажется, выполняет свою работу.

Ответ №3:

Что-то вроде этого:

  Const prefix = "snippet_"
 Dim prefixKeys = (From sessionKey In Session.Keys
                   Let name = CStr(sessionKey)
                  Where name.StartsWith(prefix)).ToList
 If prefixKeys.Any Then
     For Each key In prefixKeys
         Session.Remove(key.name)
     Next
 End If
  

Примечание: ToList() необходим, потому что вы не можете удалить его из сеанса во время итерации в противном случае (отложенное выполнение).

Ответ №4:

Одна вещь, которую вы могли бы сделать, это использовать linq для получения всех ключей, которые вы хотите (вам придется извинить мое vb.net поскольку я в основном пишу на c #):

 Dim myKeys = Session.Keys.Cast(Of String).Where(Function(k) k.StartsWith("snippet")).ToArray()