0

如果可能,我正在尝试在 div 中而不是在表中显示一行数据。所以我想控制一行中的每个 td 元素,但不涉及表格,所以对于每一行,我会将元素内联并放在一个 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 循环来查询并回显我在页面上任何位置选择的每个数据。我怎么能在这里做同样的事情?

谢谢!

4

2 回答 2

0

您可以使用中继器,如下所示:

<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>
于 2013-10-08T22:21:26.403 回答
0

不幸的是,SqlDataSource 控件旨在通过其 DataSourceId 属性与数据绑定控件一起使用……这实际上是使它如此易于使用的原因!SqlDataSource 可以用最少的代码使用,因为只有在页面的预渲染生命周期期间存在具有等于 SqlDataSource 的 ID 的 DataSourceId 属性的数据绑定控件时,才会检索其相应的数据。您可以在MSDN SqlDataSource 控件概述页面上阅读更多内容。


替代方法和解决方法

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

一:使用自定义 ItemTemplates 创建一个 ASP 中继器控件以返回多行数据。

这可能是最容易实现的方法;但由于所有对 SQL 数据的引用都必须在转发器控件中进行,因此它的实用性有所限制。但是,如果您现在只想完成工作,这可能就是您想要的。这是我关于中继器的书签链接:


二:使用内联服务器标签引用服务器端函数以返回单行数据或标量值。

恕我直言,在所有三种方法中,这一种提供了服务器端自定义、简单性和服务器-客户端交互的最佳组合。它很快成为我显示自定义数据的首选方法。我将构建一个示例。让我们假设我有一个销售教科书的 ASP.NET WebForms 网站。在这个网站上,我有一个页面 (view.aspx),允许学生查看教科书并联系卖家。在此页面中,我很可能希望显示TitleAuthorISBN等教科书信息项。教科书信息存储在名为 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

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

查看.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>

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

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

最后一个链接解释了如何执行发布操作(而不是获取操作),但它包含大量代码示例和有关如何使其工作的讨论。该方法总体上非常适合自定义,因为您可以使用 javascript 自由操作数据,但它有几个缺点值得一提:

  • 增加安全漏洞的风险,包括跨站点伪造请求。
  • 发布数据时传递多个参数可能会很棘手(请参阅最后一个链接)。
  • 可能还有一些其他的问题我现在不记得了……

结论

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

于 2013-10-09T02:05:55.000 回答