Ошибка навигации на сайте ASP.net - PullRequest
1 голос
/ 02 октября 2009

Я разработал веб-сайт с использованием visual studio 2008. В нем используется активный индекс для перехода с одной страницы на следующую.

Он будет увеличивать индекс, когда пользователь нажимает следующую кнопку. В соответствии с увеличенным значением, следующие страницы были перемещены

На первой странице есть раскрывающийся список со значениями (A, B, C, D)

Обычно веб-сайт перемещается следующим образом

Page1 -> page2 -> Page3 -> Page4 и т. Д.

Но если значение "B" в выпадающем списке на странице Page 1, что приводит к следующему потоку.

Стр.1 -> стр.2 -> Page4

Но проблема в том ... Веб-сайт ведет себя странно. Это дает следующий поток ..

Page1 -> page2 -> Page3 -> Page4 вместо Page1 -> page2 -> Page4 для этого конкретного выбора значения (значение «B») в раскрывающемся списке.

Эта проблема возникает, когда пользователь переходит на последнюю страницу, снова выходит вперед с помощью кнопки «Назад» и на последнюю страницу с помощью кнопки «Далее». (Несколько итераций, вызывающих эту проблему)

Здесь мне нужно две вещи:

  1. Почему это происходит?
  2. Как это предотвратить

Я дал код ниже:

Заранее спасибо за помощь

Protected Sub btn_view1_back_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_view1_back.Click, btn_view2_back.Click, btn_view3_back.Click
      Try
          Dim currentView As Int16
          currentView = mvRequestorForm.ActiveViewIndex
          If currentView = 3 And BSelected() = 1 Then
              mvRequestorForm.ActiveViewIndex = (currentView - 2)
          Else
              mvRequestorForm.ActiveViewIndex = (currentView - 1)
          End If

          If mvRequestorForm.ActiveViewIndex = 1 Then
              If (ddl_view0_WULValue() = 0) Then
                  'C'
                  CSelected() = 1
                  strRoleType = "chkBx_C_workunit"
              ElseIf (ddl_view0_WULValue() = 1) Then
                  'head office'
                  ASelected() = 1
                  strRoleType = "chkBx_A_workunit"
              ElseIf (ddl_view0_WULValue() = 2) Then
                  'B'
                  BSelected() = 1
                  strRoleType = "chkBx_B_workunit"
              ElseIf (ddl_view0_WULValue() = 3) Then
                  'B'
                  BSelected() = 1
                  strRoleType = "chkBx_B_workunit"
              End If
          End If

      Catch ex As Exception

      End Try
End Sub

Код кнопки «Далее» ниже:

Protected Sub btn_View0_Next_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_View0_Next.Click, btn_View1_Next.Click, btn_view2_Next.Click

    Try
        Dim currentView As Int16
        currentView = mvRequestorForm.ActiveViewIndex
        If currentView = 1 And BSelected = 1 Then
            mvRequestorForm.ActiveViewIndex = (currentView + 2)
            rfv_view2_managersEmail.Enabled = True
            rev_view2_managersEmail.Enabled = True
        Else
            mvRequestorForm.ActiveViewIndex = (currentView + 1)
        End If

        If mvRequestorForm.ActiveViewIndex = 1 Then
            Sub_ActivateView1()
        End If

    Catch ex As Exception

    End Try
End Sub

1 Ответ

5 голосов
/ 08 октября 2009

Если вы опубликовали ASelected (), BSelected (), CSelected () и ddl_view0_WULValue (), это помогло бы больше. Без этого я не смогу определить , почему это происходит. Я думаю, из-за отсутствия состояния в веб-приложении. Когда вы пытаетесь установить переменные в коде страницы, объекты остаются только во время этой обратной передачи (в данном случае, при нажатии кнопки). В следующий раз, когда произойдет нажатие кнопки, все эти данные личных переменных вашей страницы исчезнут.

Однако состояние выпадающего списка будет поддерживаться между постбеками, поэтому вы можете напрямую запросить раскрывающийся список, чтобы узнать, что было выбрано. Вместо BSelected() = 1 я изменил его на ddl_view0.SelectedValue = "B"

Я предположил, что именно так выглядела ваша aspx-страница. Обратите внимание на использование свойств Text и Value в ListItem. Мы будем использовать свойство Value в коде, чтобы найти то, что выбрано.

<asp:MultiView runat="server" ID="mvRequestorForm" ActiveViewIndex="0"
    <asp:View ID="View1" runat="server">
        1
        <asp:DropDownList ID="ddl_view0" runat="server">
            <asp:ListItem Text="Item A" Value="A"></asp:ListItem>
            <asp:ListItem Text="Item B" Value="B"></asp:ListItem>
            <asp:ListItem Text="Item C" Value="C"></asp:ListItem>
            <asp:ListItem Text="Item D" Value="D"></asp:ListItem>
        </asp:DropDownList>
        <asp:Button ID="btn_View0_Next" runat="server" Text="Next" />
    </asp:View>
    <asp:View ID="View2" runat="server">
        2
        <asp:Button ID="btn_View1_Next" runat="server" Text="Next" />
        <asp:Button ID="btn_view1_back" runat="server" Text="Back" />
    </asp:View>
    <asp:View ID="View3" runat="server">
        3
        <asp:Button ID="btn_view2_Next" runat="server" Text="Next" />
        <asp:Button ID="btn_view2_back" runat="server" Text="Back" />
    </asp:View>
    <asp:View ID="View4" runat="server">
        4
        <asp:Button ID="btn_view3_back" runat="server" Text="Back" />
    </asp:View>
</asp:MultiView>

Я изменил ваш код, чтобы избавиться от всех вызовов ASelected (), BSelected, CSelected и dll_view0_WULValue () и просто использовал раскрывающийся список напрямую.

Protected Sub btn_view1_back_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_view1_back.Click, btn_view2_back.Click, btn_view3_back.Click
    'Try'

    If mvRequestorForm.ActiveViewIndex = 3 And ddl_view0.SelectedValue = "B" Then 'CHANGED to use the SelectedValue property of the dropdownlist because it keeps state properly'
        mvRequestorForm.ActiveViewIndex -= 2 'CHANGED to a cleaner way to decrement by 2'
    Else
        mvRequestorForm.ActiveViewIndex -= 1 'CHANGED to a cleaner way to decrement by 1'
    End If

    If mvRequestorForm.ActiveViewIndex = 1 Then 'NOTE: This is now at least one less than when the method started. Is this what you really wanted?'

        If (ddl_view0.SelectedValue = "C") Then 'CHANGED to use the SelectedValue property of the dropdownlist because it keeps state properly'
            strRoleType = "chkBx_C_workunit"

        ElseIf (ddl_view0.SelectedValue = "A") Then 'CHANGED to use the SelectedValue property of the dropdownlist because it keeps state properly'
            strRoleType = "chkBx_A_workunit"

        ElseIf (ddl_view0.SelectedValue = "B") Then 'CHANGED to use the SelectedValue property of the dropdownlist because it keeps state properly'
            strRoleType = "chkBx_B_workunit"

        End If
        'NOTE: There seemed to be a duplicate case for "B" here, so I removed it'

    End If
    'Catch ex As Exception'
    'Commented out Try/Catch because empty catches hide bugs and make development harder'
    'End Try'
End Sub

Protected Sub btn_View0_Next_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_View0_Next.Click, btn_View1_Next.Click, btn_view2_Next.Click
    'Try'
    If mvRequestorForm.ActiveViewIndex = 1 And ddl_view0.SelectedValue = "B" Then
        mvRequestorForm.ActiveViewIndex += 2 'CHANGED to a cleaner way to increment by 2'
        rfv_view2_managersEmail.Enabled = True
        rev_view2_managersEmail.Enabled = True
    Else
        mvRequestorForm.ActiveViewIndex += 1 'CHANGED to a cleaner way to increment by 1'
    End If

    If mvRequestorForm.ActiveViewIndex = 1 Then 'NOTE: This is now at least one more than when the method started. Is this what you really wanted?'
        'Sub_ActivateView1()'
    End If
    'Catch ex As Exception'
    'Commented out Try/Catch because empty catches hide bugs and make development harder'
    'End Try'
End Sub

Я не знаю, для чего предназначен strRoleType, но, вероятно, это тоже не будет работать правильно. Если это не так, попробуйте добавить элемент управления HiddenField в форму и использовать его для хранения значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...