Создание нескольких строк запросов из выпадающих списков - может быть 1, 2 или 3 строки запроса. Как мне это сделать? - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть сетка, которую можно отфильтровать по одному или нескольким значениям в строке запроса.Все это прекрасно работает: например, "?subject=Maths&authorName=Bond_James&type=Magazine"

Значения, передаваемые в строку запроса, поступают из 3 раскрывающихся списков: Тема, Автор, Тип.То, что я хотел бы, это когда пользователь нажимает «Фильтр», он возьмет выбранные значения из выпадающих списков и передаст их в строку запроса - это может быть 1 значение, 2 или все 3 (как выше).

В раскрывающихся списках есть элемент «Все темы» / «Все авторы» / «Все типы», каждый со значением -1.Идея состоит в том, что если пользователь оставляет эти элементы выбранными, то кнопка «Фильтр» просто игнорирует их.

Вот мой код:

  Protected Sub buttonFilterGo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles buttonFilterGo.Click

    Dim queryString As String
    Dim selectedAuthorString As String = "author=" & dropAuthorList.SelectedItem.Value
    Dim selectedSubjectString As String = "subject=" & dropSubjectList.SelectedItem.Value
    Dim selectedTypeString As String = "type=" & dropPaperType.SelectedItem.Value
    Const PATH As String = "~/paper/browse/?"






    queryString = selectedAuthorString & "&" & selectedSubjectString & "&" & selectedTypeString
    If IsNothing(queryString) Then
        labelFilterFeedback.Text = "Apply some filters then press Go"
    Else
        Response.Redirect(PATH & queryString)
        labelFilterFeedback.Text = ""
    End If


End Sub

Кроме того, еще одна вещь.Как получить раскрывающиеся списки для выбора фильтров при повторной загрузке страницы?

Буду очень признателен за любую помощь!

РЕДАКТИРОВАТЬ: я изменил значения по умолчаниювыпадающие списки на "" - хотя URL выглядит беспорядочно ?author=&subject=&type= Это работает, это лучший способ?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2011

Я не VB человек, так что простите за любые синтаксические ошибки.При таком подходе строка запроса добавляется только при наличии значений, и добавляются только термины для этих параметров со значениями.Я использовал «! =» Как оператор «Не равно».Я не уверен, что VB использует вместо этого «<>».Пожалуйста, рассмотрите это как псевдокод, чтобы проиллюстрировать идею.

Dim queryString As String = "?"
...
 Const PATH As String = "~/paper/browse/"
...

If dropAuthorList.SelectedItem.Value != "" Then
   queryString = queryString & selectedAuthorString 
EndIf
If dropSubjectList.SelectedItem.Value != "" Then
   If querystring.Length > 1 Then
        queryString = queryString + "&"
   EndIf
   queryString = queryString & selectedSubjectString 
EndIf
If dropPaperType.SelectedItem.Value != "" Then
   If querystring.Length > 1 Then
        queryString = queryString + "&"
   EndIf
   queryString = queryString & selectedTypeString 
EndIf
If querystring.Length = 1 Then
    queryString = ""
EndIf
0 голосов
/ 19 февраля 2011

Вы можете продолжать использовать пустое строковое значение, и я бы предпочел предпочесть его назначенному значению, даже если -1, как правило, хороший выбор, поскольку маловероятно, что один из ваших фильтров будет использовать его в качестве значения. Я бы очистил вашу строку запроса, вызвав что-то вроде следующей функции:

Private Function AppendFilter(ByVal filterName As String, ByVal filterVal As String, ByVal query As String) As String
    Dim res As String = query

    If filterVal.Length() > 0 Then 
        res = IIf(query.Length() > 0, query & "&", query) & filterName & "=" & filterVal
    End If

    Return res
End Function

вместо этой строки из вашего кода: queryString = selectedAuthorString & "&" & selectedSubjectString & "&" & selectedTypeString

Ваш полученный код будет выглядеть так:

Protected Sub buttonFilterGo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles buttonFilterGo.Click

    Dim queryString As String = ""
    Const PATH As String = "~/paper/browse/?"

    queryString = AppendFilter("author", dropAuthorList.SelectedItem.Value, queryString)
    queryString = AppendFilter("subject", dropSubjectList.SelectedItem.Value, queryString)
    queryString = AppendFilter("type", dropPaperType.SelectedItem.Value, queryString)

    If queryString.Length() <= 0 Then
        labelFilterFeedback.Text = "Apply some filters then press Go"
    Else
        Response.Redirect(PATH & "?" & queryString)
        labelFilterFeedback.Text = ""
    End If
End Sub

И ваша строка запроса не будет содержать фильтры, которые не применяются.

...