Более эффективный / предпочтительный способ использования переменных сеанса? - PullRequest
3 голосов
/ 29 января 2011

У меня есть ASP DataGrid, и я применяю к нему сортировку. Ну, как я видел в примере, у них была функция, похожая по функции, отличающаяся по имени, на:

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand
    Dim strSortDirection As String = Session("SortDir")
    If strSortDirection = Nothing Then
        strSortDirection = " ASC "
    Else
        If strSortDirection = " ASC " Then
            strSortDirection = " DESC "
        Else
            strSortDirection = " ASC "
        End If
    End If
    Session("SortDir") = strSortDirection
    BindData(e.SortExpression & strSortDirection)
End Sub

Ну, я пытался сделать ярлыки и сделать вещи "проще" подумал, может быть, это будет лучше:

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand
    If Session("SortDir") = Nothing Then
        Session("SortDir") = " ASC "
    Else
        If Session("SortDir") = " ASC " Then
            Session("SortDir") = " DESC "
        Else
            Session("SortDir") = " ASC "
        End If
    End If
    BindData(e.SortExpression & Session("SortDir"))
End Sub

Однако, когда я думал об этом, я подумал, что, возможно, Session("SortDir") должен делать запрос каждый раз, и это может иметь некоторые недостатки или недостатки. Но я не был уверен. Есть ли у кого-нибудь ссылки, которые бы объяснили лучший или предпочтительный метод. Спасибо.

Ответы [ 3 ]

1 голос
/ 29 января 2011

Поиск значения Session дважды (одно чтение и одна запись), а не четыре раза, кажется явно лучше.Разница в производительности не будет заметна пользователю, но все эти избыточные поиски сделают большинство программистов очень неудобными!И бывают случаи, когда подобные вещи могут иметь заметное значение, в зависимости от объема данных, хранящихся в коллекции, и типа выполняемого поиска (хэш-таблица, двоичный поиск, последовательный поиск и т. Д.), Так что, вероятноне очень хорошая привычка.

1 голос
/ 29 января 2011

Это не очень хорошее использование Session в этом сценарии просто потому, что есть лучшие способы сделать это. Сессии должны содержать определенные данные о конечном пользователе каким-либо образом.

Попробуйте что-нибудь в этом духе

Private Property _SortDir As Nullable(Of String) ''# I used "Nullable(Of" because I don't know if you are able to use "String?"
Public Property SortDir() As Nullable(Of String)
    Get
        Return _SortDir
    End Get
    Set
        _SortDir = value
    End Set
End Property

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand

    If SortDir.IsNullOrEmpty Or SortDir = "DESC" Then
        SortDir = "ASC"
    Else
        SortDir = "DESC"
    End If

    BindData(e.SortExpression & SortDir))
End Sub

Я подумал еще об одной причине, по которой вы можете сохранить sortOrder в сеансе, однако это может иметь некоторые неприятные побочные эффекты. Если вы хотите покинуть текущую страницу и вернуться позже с тем же порядком сортировки, а затем оставить ее в сеансе ... НО, что если у вас есть другая сетка в другом месте на сайте, у вас будет другая переменная сеанса для Это? или вы собираетесь сохранить существующий порядок сортировки в новой сетке? Это все, что вам нужно учитывать при использовании переменных сеанса.

Если вы остаетесь на существующей странице, используйте элементы, которые находятся в вашем распоряжении для этой страницы. Черт возьми, вы «могли» использовать _VIEWSTATE для хранения порядка сортировки (хотя я бы не рекомендовал его).

Помните, что сеть спроектирована как не имеющая состояния, поэтому создание "состояния" немного нежелательно.

И наконец.

Другой вариант для вас - установить порядок сортировки в строке запроса и забыть обо всем остальном (не полностью работает с AJAX).

0 голосов
/ 29 января 2011

Так как вы хотите постоянство на уровне сеанса, я бы добавил два небольших изменения к предложению rockinthesixstring :

(Внимание: кодер C # пытается написать VB!)

Private Property _SortDir As Nullable(Of String)
Public Property SortDir() As Nullable(Of String)
    Get
        Return _SortDir
    End Get
    Set
        Session("SortDir") = value
        _SortDir = value
    End Set
End Property

Private Sub dgTasks_SortGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) Handles dgTasks.SortCommand

    If SortDir = "ASC" Then    'I think the outer If block was redundant''
        SortDir = "DESC"
    Else
        SortDir = "ASC"
    End If

    BindData(e.SortExpression & SortDir))
End Sub

Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If Not Page.IsPostBack Then
        _SortDir = Session("SortDir")
    End If
End Sub

Этот код в основном C & P от rockinthesixstring , поэтому, если вы используете этот ответ, пожалуйста, примите или подтвердите его.

...