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 должны быть сделаны в элементе управления повторителем, он несколько ограничен в своей полезности. Однако, если вы хотите просто выполнить работу на данный момент, это, вероятно, то, что вы хотите пойти. Вот мои закладки в закладках относительно ретрансляторов:
- asp.net - Получение имени столбца в повторителе в OnItemCreated
- Использование вложенных повторителей для отображения иерархических данных
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 немного сложнее, чем в нашем предыдущем примере, и, вероятно, выходит за рамки этого ответа, поэтому вместо этого приведу несколько очень полезных ссылок, которые я добавил в закладки:
- Ваш первый веб-API
- Использование веб-API с веб-формами ASP.NET
- Патч для включения MVC 4 для Visual Studio 2010 SP1 и Visual Web Developer 2010 SP1
- Подробное руководство по использованию JSON для публикации данных
Эта последняя ссылка объясняет, как выполнить действие после публикации (в отличие от действия 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>