2009-10-02 8 views
1

J'ai développé un site web en utilisant Visual Studio 2008. Ce qui utilise l'index actif pour naviguer d'une page à l'autre.Erreur de navigation sur le site ASP.net

Il incrémentera l'index lorsque l'utilisateur cliquera sur le bouton suivant. Selon la valeur incrémentée, pages suivantes a été naviguée

Il y a une baisse dans la première page avec les valeurs (A, B, C, D)

Normalement, le site de naviguer en la manière suivante

Mais si la valeur "B" dans une liste déroulante dans la page 1 qui résulte dans le flux suivant

Page1 -> page2 -> Page4

Mais le problème est ... Site Web agit étrange. Il donne le flux suivant ..

Page1 -> page2 -> Page3 -> Page4 au lieu de Page1 -> page2 -> Page4 pour cette sélection de valeur particulière (valeur "B") dans la sélection déroulante.

Ce problème se produit, lorsque l'utilisateur va à la dernière page de nouveau venir à l'avant en utilisant le bouton de retour et aller à la dernière page en utilisant le bouton "suivant". (Itérations multiples provoquant ce problème)

Deux choses que je dois ici:

  1. Pourquoi se produit?
  2. Comment éviter ce

J'ai donné le code ci-dessous:

Merci pour l'aide à l'avance

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 

Code pour le bouton Suivant ci-dessous:

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

pouvez-vous publier le fichier ASPX ainsi – chugh97

Répondre

5

Si vous avez publié ASelected(), BSelected(), CSelected() et ddl_view0_WULValue() ont aidé plus. Sans cela, je ne peux pas vraiment déterminer pourquoi ça se passe. Ma conjecture est à cause du manque d'état dans une application web. Lorsque vous essayez de définir des variables dans le code d'une page, les objets restent uniquement pendant cette publication (dans ce cas, un clic sur un bouton). La prochaine fois que vous cliquerez sur un bouton, toutes les données de vos variables privées auront disparu. Cependant, l'état de la liste déroulante sera maintenu entre les publications, de sorte que vous pouvez interroger la liste déroulante directement pour savoir ce qui a été sélectionné. Au lieu de BSelected() = 1, je l'ai changé pour ddl_view0.SelectedValue = "B"

J'ai supposé que c'est ce à quoi ressemblait votre page ASPX. Notez l'utilisation des propriétés Text et Value sur ListItem. Nous allons utiliser la propriété Value dans le code pour trouver ce qui est sélectionné.

<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> 

J'ai changé votre code pour se débarrasser de tous les appels ASelected(), BSelected, CSelected et dll_view0_WULValue() et il suffit d'utiliser la liste déroulante directement.

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 

Je ne sais pas ce que strRoleType est pour, mais probablement ne fonctionnera pas correctement non plus. Si ce n'est pas le cas, essayez de supprimer un contrôle HiddenField sur votre formulaire et utilisez-le pour stocker la valeur.

Questions connexes