ASP.NET如何在div中显示sqldatasource行?

时间:2013-10-08 22:19:00

标签: mysql asp.net loops html sqldatasource

我试图在div中而不是在表中显示一行数据(如果可能)。所以我想控制一行中的每个td元素,但是没有涉及到的表,所以foreach行我将元素内联并放在div中,所以我可以在一些java脚本动画中使用它们。

<asp:sqldatasource ID="dsEvents" runat="server" ConnectionString="<%$ ConnectionStrings:Maryville %>" runat="server" 
        SelectCommand="SELECT e.* FROM rew_Event e INNER JOIN rew_Timeframe t ON t.timeframeID = e.timeframeID WHERE e.dateStart >= @today AND e.active = 1 ORDER BY e.dateStart ASC">
        <SelectParameters>
            <asp:ControlParameter ControlID="hidDateTime" Type="DateTime" Name="today" />
        </SelectParameters>
</asp:sqldatasource>

因此对于这个源我想将每一行显示为div,我根本不想处理表。这可能吗?我知道在PHP中我可以通过创建for或foreach循环来查询然后回显我在页面任何地方选择的每个数据。我怎么能在这里做同样的事情呢?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用Repeater,如下所示:

<asp:Repeater ID="test" runat="server">
<HeaderTemplate>
   <div class="rowcontainer">
</HeaderTemplate>
<ItemTemplate>
   <div style="float:left;">
      <%#Eval("Column1") %>
   </div>
</ItemTemplate>
<FooterTemplate>
   </div>
</FooterTemplate>
</asp:Repeater>

答案 1 :(得分:0)

不幸的是,SqlDataSource控件是设计的,可以通过DataSourceId属性处理数据绑定控件......这实际上是什么让它变得如此简单易用! SqlDataSource可以与最少的代码一起使用,因为只有在页面的预渲染生命周期期间存在具有等于SqlDataSource ID的DataSourceId属性的数据绑定控件时,才会检索其相应的数据。您可以在MSDN SqlDataSource Control Overview page上阅读更多内容。


替代方法和解决方法

当我希望 reeeally 内联我的服务器端代码(例如在自定义div中放置字段值)时,我通常使用以下技术之一:

ONE:使用自定义ItemTemplates创建ASP转发器控件以返回多行数据。

这可能是最简单的实施方法;但由于所有对SQL数据的引用都必须在转发器控件中进行,因此它的实用性有限。但是,如果您希望暂时完成工作,这可能就是您想要的。以下是关于中继器的书签链接:


TWO:引用服务器端函数,使用内联服务器标记返回单行数据或标量值。

恕我直言,在这三种方法中,这一方法提供了服务器端定制,简单性和服务器 - 客户端交互的最佳组合。它很快成为我显示自定义数据的首选方法。我将构建一个例子。我们假设我有一个销售教科书的ASP.NET WebForms网站。在这个网站上,我有一个页面(view.aspx),允许学生查看教科书并联系卖家。在此页面中,我很可能希望显示教科书信息项,例如标题作者 ISBN 。教科书信息存储在名为TextbookPostInfo的SQL表或视图中。此表中的每个条目都由其主键postid标识。 postid值通过URL参数传递给页面。

我将首先构建一个TextBookPost类来包含信息项......

Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.SqlClient

Namespace MyClassLibrary
Public Class TextBookPost

            Sub New(ByVal post_id As Guid)

                Dim queryString As String = "select * from PostInfoView where postid = @postid"

                Using cmd As New SqlCommand(queryString, New SqlConnection(ConfigurationManager.ConnectionStrings("MyDbConnection").ConnectionString))
                    cmd.Parameters.AddWithValue("@postid", post_id).SqlDbType = SqlDbType.UniqueIdentifier

                    Dim rdr As SqlDataReader

                    Try
                        cmd.Connection.Open()
                        rdr = cmd.ExecuteReader
                        While rdr.Read
                            _postid = rdr("postid")
                            _author = rdr("author")
                            _isbn = rdr("isbn")
                            _title = rdr("title")
                        End While

                    Catch ex As Exception
                        'INSERT ERROR-HANDLING CODE'
                        cmd.Connection.Close()
                    End Try

                    cmd.Connection.Close()

                End Using

            End Sub

            Private _postid As Guid
            ''' <summary>
            ''' Gets the postid.
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public ReadOnly Property postid As Guid
                Get
                    Return _postid
                End Get
            End Property

            Private _title As String
            ''' <summary>
            ''' Gets the title of the textbook for this post.
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public ReadOnly Property title As String
                Get
                    Return _title
                End Get
            End Property

            Private _isbn As String
            ''' <summary>
            ''' Gets the isbn of the textbook for this post.
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public ReadOnly Property isbn As String
                Get
                    Return _isbn
                End Get
            End Property

            Private _author As String
            ''' <summary>
            ''' Gets the author of the textbook for this post.
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public ReadOnly Property author As String
                Get
                    Return _author
                End Get
            End Property
End Class
End Namespace

现在我的信息项有一个很小的容器,让我们在page_load中添加一些代码,使用给定的URL参数postid来检索这些信息。

View.aspx.vb(我的代码隐藏文件)......

Imports System.Data.SqlClient
Imports System.Data
Imports MyClassLibrary
Partial Class view
    Inherits System.Web.UI.Page

Private _thispost As TextBookPost = Nothing

    ''' <summary>
    ''' Gets the information for the current post.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property thispost As TextBookPost
        Get
            Return _thispost
        End Get
    End Property

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            If Request.QueryString("postid") Is Nothing Then GoTo NoPostId
            Dim postid As Guid = Guid.Parse(Request.QueryString("postid").ToString)

            Dim tb As New TextBookPost(postid)
            _thispost = tb
        End If

        Exit Sub
NoPostId:
            'INSERT CODE TO HANDLE INVALID POST ID'
    End Sub

所以现在我有一个漂亮而又整洁的textbookpost对象作为变量存储在我的代码隐藏中。现在,我可以在创建页面标记时由我自己或(如果您正在管理团队开发项目)访问您的字体结束工程师/开发人员。

View.aspx

<HTML>
    <Body>
    <form id="form1" runat="server">
    <div class="post-info-container">
        <!-- ========================================= -->
        <!-- Title -->
        <!-- ========================================= -->
        <div class="post-info-item-title post-info-item">
            <span class="post-info-item-label-title post-info-item-label item-label">
                Title
            </span>
            <span class="post-info-item-text-title post-info-item-text item-text">
                <asp:Label runat="server" ID="titlelabel">
                    <%= thispost.title%>
                </asp:Label>
            </span>
        </div>

        <!-- ========================================= -->
        <!-- Author -->
        <!-- ========================================= -->
        <div class="post-info-item-author post-info-item">
            <span class="post-info-item-label-author post-info-item-label item-label">
                Author
            </span>
            <span class="post-info-item-text-author post-info-item-text item-text">
                <asp:Label runat="server" ID="authorlabel">
                    <%= thispost.author%>
                </asp:Label>
            </span>
        </div>
        <!-- ========================================= -->
        <!-- ISBN -->
        <!-- ========================================= -->
        <div class="post-info-item-isbn post-info-item">
            <span class="post-info-item-label-isbn post-info-item-label item-label">
                ISBN
            </span>
            <span class="post-info-item-text-isbn post-info-item-text item-text">
                <asp:Label runat="server" ID="isbnlabel">
                    <%= thispost.isbn%>
                </asp:Label>
            </span>
        </div>
    </div> 
    </form>
    </Body>
</HTML>

THREE:使用jQuery $ .Get()或$ .ajax调用构建Web API并检索数据。

当您希望以正确的方式执行部分页面更新时(即,不使用更新面板),此方法非常有效。仅供参考:如果您仍在使用更新面板,请注意本节。实现MVC比我们之前的例子稍微复杂一点,可能超出了这个答案的范围,所以这里有一些非常有用的链接,我已经加入了书签:

最后一个链接解释了如何执行 post 操作(而不是 get 操作),但它包含大量代码示例和有关如何进行的讨论这行得通。整个方法非常适合自定义,因为您可以使用javascript自由地操作数据,但它有一些值得一提的缺点:

  • 更多地暴露于安全漏洞,包括跨站点伪造请求。
  • 发布数据时传递多个参数可能会非常棘手(请参阅最后一个链接)。
  • 此时我可能还记不起其他一些问题......

结论

这三种方法都很重要,但它们都是情境性的。您只需要确定哪种方法最适合您的目标。另一个有用的技术是创建ASP.NET自定义服务器控件,但这有点复杂,通常涉及创建单独的Visual Studio项目。无论如何......我希望这会有所帮助。