2016-03-03 42 views
0

我有一个非常奇怪的问题。我正在创建一个网页,从数据库中检索链接列表并显示它们。我检索记录并将它们加载到对象列表中。但是,当我在后面遍历该列表时,我将显示重复的项目。显示数据库信息时显示重复的条目 - VB.Net ASP.Net

页以查看结果是http://myhacc.azurewebsites.net/testlinks.aspx

应该只有每个环节的1,正如你可以看到有各自的2。至于为什么我没有丝毫的意思。我已经完成了10次逻辑。

我正在使用在Microsoft Azure上运行的Microsoft SQL Server 网页也作为Web应用程序在Microsoft Azure上托管。

我检查了我的数据库,数据库中没有重复的条目。 的数据库的结构如下

表:myportal_lcat 字段:ID - 整数 字段:名称 - 文本

表:myportal_lhref 字段:CATID - 整数 字段:DNAME - 文本 字段: HREF - 文本

的代码如下

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

您的页面加载运行多次?你将不得不从你的最后调试。我没有看到任何通常会导致加载两次的内容。 –

+0

使用2个纪元来获取数据似乎有点浪费。从你的代码看来,你在ID列上加入了2个表。那么为什么不把它写成一个声明,并保护自己必须加入复杂循环表的麻烦...... – Jeroen

+0

肖恩兰格 - 这是页面加载运行两次的问题。我不知道为什么它应该运行两次,但它是。我将声明的初始化从声明移到了do循环之上,并解决了问题。 – Velocibadgery

回答

0

的问题是CA使用的事实是,当使用asp.net masterpages时,page_load首先在masterpage中调用,然后在实际页面中再次调用。但是,两者的代码都会运行两次。

当我在声明中初始化对象列表时,我在向页面加载列表中添加项目时,它在页面加载运行两次时添加了两次。我将对象列表的初始化移入了page_load而不是声明,这解决了我的问题。

参考:Page_Load is firing twice in ASP.NET page