不幸的是,SqlDataSource 控件旨在通过其 DataSourceId 属性与数据绑定控件一起使用……这实际上是使它如此易于使用的原因!SqlDataSource 可以用最少的代码使用,因为只有在页面的预渲染生命周期期间存在具有等于 SqlDataSource 的 ID 的 DataSourceId 属性的数据绑定控件时,才会检索其相应的数据。您可以在MSDN SqlDataSource 控件概述页面上阅读更多内容。
替代方法和解决方法
当我想与我的服务器端代码重新内联时(例如在自定义 div 中放置字段值),我通常使用以下技术之一:
一:使用自定义 ItemTemplates 创建一个 ASP 中继器控件以返回多行数据。
这可能是最容易实现的方法;但由于所有对 SQL 数据的引用都必须在转发器控件中进行,因此它的实用性有所限制。但是,如果您现在只想完成工作,这可能就是您想要的。这是我关于中继器的书签链接:
二:使用内联服务器标签引用服务器端函数以返回单行数据或标量值。
恕我直言,在所有三种方法中,这一种提供了服务器端自定义、简单性和服务器-客户端交互的最佳组合。它很快成为我显示自定义数据的首选方法。我将构建一个示例。让我们假设我有一个销售教科书的 ASP.NET WebForms 网站。在这个网站上,我有一个页面 (view.aspx),允许学生查看教科书并联系卖家。在此页面中,我很可能希望显示Title、Author和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
所以现在我在我的代码隐藏中有一个漂亮而整洁的课本对象作为变量存储。这个变量现在可以由我自己或(如果您正在管理一个团队开发项目)您的字体端工程师/开发人员在创建页面标记时访问。
查看.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 项目。无论如何......我希望这会有所帮助。