ASP.NET Как отобразить строку sqldatasource в div?

Я пытаюсь отобразить строку данных в 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. Как я могу сделать то же самое здесь?

Спасибо!

2 ответа

Решение

К сожалению, элемент управления SqlDataSource предназначен для работы с элементами управления, связанными с данными, через их атрибуты DataSourceId... Что на самом деле делает его таким простым в использовании! SqlDataSource можно использовать с минимальным кодом, поскольку его соответствующие данные извлекаются только в том случае, если в течение жизненного цикла страницы перед рендерингом существует элемент управления с привязкой к данным с атрибутом DataSourceId, равным идентификатору SqlDataSource. Вы можете прочитать об этом немного больше на странице обзора элемента управления SqlDataSource в MSDN.


Альтернативные методы и обходные пути

Когда я хочу по-настоящему подключиться к своему серверному коду (например, поместив значения полей в пользовательские элементы div), я обычно использую один из следующих методов:

ONE: Создать элемент управления повторителя ASP с пользовательскими шаблонами ItemTemplate для возврата нескольких строк данных.

Это, наверное, самый простой способ для реализации; но поскольку все ссылки на данные SQL должны быть сделаны в элементе управления повторителем, он несколько ограничен в своей полезности. Однако, если вы хотите просто выполнить работу на данный момент, это, вероятно, то, что вы хотите пойти. Вот мои закладки в закладках относительно ретрансляторов:


TWO: Ссылка на функции на стороне сервера с использованием встроенных серверных тегов для возврата одной строки данных или скалярного значения.

ИМХО, из всех трех методов этот предлагает наилучшую комбинацию настройки на стороне сервера, простоты и взаимодействия сервер-клиент. Это быстро стало моим методом отображения пользовательских данных. Я построю пример. Предположим, у меня есть веб-сайт ASP.NET WebForms, который продает учебники. На этом сайте у меня есть страница (view.aspx), которая позволяет ученику просматривать учебник и связываться с продавцом. На этой странице я, скорее всего, захочу отобразить информационные элементы учебника, такие как Заголовок, Автор и ISBN. Информация об учебнике хранится в таблице или представлении SQL с именем TextbookPostInfo. Каждая запись в этой таблице идентифицируется своим первичным ключом 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>

ТРИ: Создайте веб-API и получите данные, используя вызовы jQuery $.Get() или $.ajax.

Этот метод работает очень хорошо, когда вы хотите правильно выполнить частичное обновление страницы (т.е. без использования панелей обновления). К вашему сведению: если вы все еще используете панели обновления, обратите внимание на этот раздел. Реализация MVC немного сложнее, чем в нашем предыдущем примере, и, вероятно, выходит за рамки этого ответа, поэтому вместо этого приведу несколько очень полезных ссылок, которые я добавил в закладки:

Эта последняя ссылка объясняет, как выполнить действие после публикации (в отличие от действия get), но содержит множество примеров кода и обсуждение того, как заставить его работать. В целом, этот метод отлично подходит для настройки, поскольку вы можете свободно манипулировать данными с помощью javascript, но у него есть пара недостатков, о которых стоит упомянуть:

  • Повышенная подверженность уязвимостям безопасности, включая запросы на подделку сайтов.
  • Передача нескольких параметров может быть сложно при публикации данных (см. Последнюю ссылку).
  • Вероятно, некоторые другие проблемы, которые я не могу вспомнить в это время...

Заключение

Все три метода важны, но они ситуативны. Вам просто нужно решить, какой метод лучше всего подходит для вашей цели. Еще один полезный метод - создание пользовательских серверных серверных элементов управления ASP.NET, но он немного сложнее и обычно включает создание отдельного проекта Visual Studio. Во всяком случае... Я надеюсь, что это помогает.

Вы можете использовать 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>
Другие вопросы по тегам