2011-01-28 4 views
3

У меня есть ASP DataGrid, и я применяю его сортировку. Ну, как я смотрел на пример, они имели функцию аналогичные функции, разные по названию, чтобы:Более эффективный/предпочтительный способ использования переменных Session?

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") должен сделать запрос каждый раз, и это может иметь некоторые недостатки или повлиять. Но я не был уверен. У кого-нибудь есть ссылки, которые объясняли бы лучший или предпочтительный метод. Благодарю.

+0

Не является ли избыточное условие 'If' избыточным? –

+0

Да, это было так. Я печатал его так, как я думал.:) – XstreamINsanity

ответ

1

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

+0

Да, это меня беспокоило, поэтому я и спросил. Поскольку я технически новичок в веб-программировании, я подумал, что тревога была неосознанностью. – XstreamINsanity

1

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

попробовать что-то вдоль этих линий

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 в сессии, однако он будет иметь некоторые неприятные побочные влияет. Если вы хотите покинуть текущую страницу и вернуться позже с тем же порядком сортировки, оставьте ее в сеансе ... НО, что, если у вас есть другая сетка в другом месте сайта, у вас будет другая переменная сеанса для Это? или вы собираетесь сохранить существующий порядок сортировки в новой сетке? Это все, о чем вам нужно подумать при использовании переменных Session.

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

Помните, что сеть предназначена для безгражданства, поэтому изготовление «состояния» немного нежелательно.

И наконец.

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

+0

Проблема в том, что SortDir каждый раз сбрасывается. Спасибо хоть. – XstreamINsanity

+0

Вы каждый раз изменяете свою переменную сеанса. Сеансы отбрасывают куки-файлы на клиентской машине, поэтому вы не только каждый раз перезапускаете переменную, но и с сеансом, вы также отправляете данные по кабелю каждый раз. –

+0

Отредактировано для удаления глупого внешнего блока IF. –

0

Поскольку вы хотите уровня сеанса настойчивость, я бы добавить два небольших изменения в rockinthesixstring предложение «s:

(Внимание: 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'd от rockinthesixstring, поэтому, если вы используете этот ответ, пожалуйста, либо принимайте, либо повышайте его.

+0

Я также удалил внешний блок If. Это было глупо. –

+0

Кроме того, если вы гарантируете, что свойство имеет значение в Page_Load, тогда нет причин иметь его «Nullable» - Да, есть много способов скинуть этот кот ;-) –

+0

@rockinthesixstring, не являются строками уже обнуляется в VB? Они находятся на C#, и на самом деле каждый другой язык, о котором я знаю, подумайте об этом. Это просто, чтобы инициализировать его до нуля? –

Смежные вопросы