2016-03-03 4 views
0

J'ai un problème vraiment étrange. Je crée une page Web qui récupère une liste de liens d'une base de données et les affiche. Je récupère les enregistrements et les charge dans une liste d'objets. Toutefois, lorsque je parcourt cette liste plus tard, les éléments en double s'affichent.Dupliquer les entrées affichées lors de l'affichage des informations de la base de données - VB.Net ASP.Net

La page pour voir le résultat est http://myhacc.azurewebsites.net/testlinks.aspx

Il devrait y avoir seulement 1 de chaque lien et comme vous pouvez le voir il y a 2 de chacun. Je n'ai pas la moindre idée de pourquoi. J'ai été sur ma logique 10 fois.

J'utilise un Microsoft SQL Server fonctionnant sur Microsoft Azure La page Web est également hébergé sur Microsoft Azure comme une application Web.

J'ai vérifié ma base de données et il n'y a pas d'entrées en double dans la base de données. la structure de la base de données est la suivante

Tableau: myportal_lcat champ: id - entier champ: nom - texte

Tableau: myportal_lhref Champ: catid - entier champ: dname - texte Champ: href - texte

le code est le suivant

<%@ Page Title="" Language="VB" MasterPageFile="~/Main.master" %> 

<script runat="server"> 
    Private oCon As Data.SqlClient.SqlConnection 
    Private oCon2 As Data.SqlClient.SqlConnection 
    Private oCatCom As New Data.SqlClient.SqlCommand 
    Private oCatRead As Data.SqlClient.SqlDataReader 
    Private oItemCom As New Data.SqlClient.SqlCommand 
    Private oItemRead As Data.SqlClient.SqlDataReader 
    Private liLinks As New List(Of linkItem) 

    Private Sub Page_Load() Handles Me.Load 
     oCon = New Data.SqlClient.SqlConnection("Server=xxxx,1433;Database=xxxxx;User ID=xxxxxx;Password=xxxxx;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;") 
     oCon2 = New Data.SqlClient.SqlConnection("Server=xxxxxx,1433;Database=xxxx;User ID=xxxx;Password=xxxxx;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;") 
     oCon.Open() 
     oCon2.Open() 
     oCatCom.Connection = oCon 
     oCatCom.CommandText = "Select * From myportal_lcat" 
     oItemCom.Connection = oCon2 
     oItemCom.CommandText = "Select * From myportal_lhref" 
     oCatRead = oCatCom.ExecuteReader() 
     oItemRead = oItemCom.ExecuteReader() 
     Do While oItemRead.Read 
      liLinks.Add(New linkItem With {.CatID = oItemRead("catid"), .DName = oItemRead("dname"), .HREF = oItemRead("href")}) 
     Loop 
    End Sub 

    Private Class linkItem 
     Private m_CatID As Integer 
     Private m_DName As String 
     Private m_HREF As String 
     Public Property CatID() As Integer 
      Get 
       CatID = m_CatID 
      End Get 
      Set(value As Integer) 
       m_CatID = value 
      End Set 
     End Property 
     Public Property DName() As String 
      Get 
       DName = m_DName 
      End Get 
      Set(value As String) 
       m_DName = value 
      End Set 
     End Property 
     Public Property HREF() As String 
      Get 
       HREF = m_HREF 
      End Get 
      Set(value As String) 
       m_HREF = value 
      End Set 
     End Property 
    End Class 
</script> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
    My Portal - Test 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="PageHeader" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="PageContent" Runat="Server"> 
    <%Dim t As linkItem %> 
    <%Do While oCatRead.Read()%> 
     <section class="links"> 
      <h2><%=oCatRead("name") %></h2> 
      <ul> 
       <%For each t In liLinks %> 
        <%If t.CatID = oCatRead("id") Then %> 
         <li><a href="<%=t.HREF %>"><%=t.DName %></a></li> 
        <%End If %> 
       <%Next %> 
      </ul> 
     </section> 
    <%Loop%> 
</asp:Content> 
+1

est-il votre charge de page plusieurs fois en cours d'exécution? Vous allez devoir déboguer cela de votre côté. Je ne vois rien qui le ferait normalement charger deux fois. –

+0

Il semble un peu inutile d'utiliser 2 qeuries pour obtenir les données. Il semble que votre code rejoignant les 2 tables sur une colonne d'id. Alors pourquoi ne pas l'écrire comme une seule déclaration et vous éviter les tracas d'avoir à rejoindre les tables avec des boucles compliquées ... – Jeroen

+0

Sean Lange - C'était le problème que le chargement de la page fonctionnait deux fois. Je ne sais pas pourquoi ça devrait fonctionner deux fois mais ça l'était. J'ai déplacé l'initialisation de la liste de la déclaration juste au-dessus de la boucle do et cela a corrigé le problème. – Velocibadgery

Répondre

0

le problème est ca Utilisé par le fait que lors de l'utilisation des pages master asp.net, la page_load est appelée en premier dans la page master, puis à nouveau dans la page actuelle. Cependant, le code des deux s'exécute deux fois. Comme j'initialisais la liste d'objets dans la déclaration lorsque j'ajoutais des éléments à la liste dans le chargement de la page, elle les ajoutait deux fois car page_load s'exécutait deux fois. J'ai déplacé l'initialisation de la liste d'objets dans le page_load au lieu de la déclaration et ceci a résolu mon problème.

Référence: Page_Load is firing twice in ASP.NET page