我创建了一个母版页面。我创建了一个名为default.aspx的默认页面.defult aspx文件包含所有标准内容和ID。在ID中我创建了一个div标签来保存动态页面的内容。
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="Default.aspx.vb" Inherits="P03_S02.Link1" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="DynPage" runat="server"></div>
</asp:Content>
这一切都很好。因此,通过使用Visual Studio 2012附带的SQL Server express,我创建了一个包含数据的表。表中的实体是 产品ID 名称 价钱 数量
现在在default.aspx.vb页面中,我完成了以下代码。
Imports System.Data
Imports System.Data.SqlClient
Public Class Catelog
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Dim Connection As SqlConnection
Dim Command As SqlCommand
Dim Reader As SqlDataReader
Connection = New SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Products.mdf;Integrated Security=True")
Dim CommandString As String
CommandString = "SELECT * FROM Product"
Command = New SqlCommand(CommandString)
Command.CommandType = CommandType.Text
Command.Connection = Connection
Command.Connection.Open()
Command.ExecuteNonQuery()
Reader = Command.ExecuteReader(CommandBehavior.CloseConnection)
Dim ProductList As String
If Reader.HasRows Then
ProductList &= "<table width=""100%"">"
ProductList &= " <tr bgcolor=""#00CCFF"">"
ProductList &= "<td><b>ID</b></td>"
ProductList &= "<td><b>Product</b></td>"
ProductList &= "<td><b>Price</b></td>"
ProductList &= "<td><b>Quantity</b></td>"
ProductList &= "</tr>"
While Reader.Read
Dim newProduct As String
ProductList &= "<tr>"
ProductList &= "<td>" & Reader("ProductID") & "</td>" & _
"<td>" & "<a href=""Link1.aspx?ProdID=""" & Reader("Name") & ">" & Reader("Name") & "</a>" & "</td>" & _
"<td>" & Reader("Price") & "</td>" & _
"<td>" & Reader("Quantity") & "</td>"
ProductList &= "</tr>"
End While
ProductList &= "</table>"
End If
Catelog.InnerHtml = ProductList
Command.Connection.Close()
' Command.Dispose()
Connection.Dispose()
ProductCatelog.InnerHtml = ProductList
End If
End Sub
End Class
如您所见,该表将显示表中的所有数据。在while循环中,我将表中的每个名称超链接到另一个名为Link1的apsx文件。
我使用了与上面相同的代码,但改变了Link1.aspx.vb中的一些内容
添加了:
Dim ProductID As String
ProductID = Request.QueryString("ProdID").ToString()'problem possible here
更改了数据显示:
Dim ProductList As String
If Reader.HasRows Then
ProductList &= "<table width=""100%"">"
ProductList &= " <tr bgcolor=""#00CCFF"">"
ProductList &= "<td><b>Product</b></td>"
ProductList &= "<td><b>Price</b></td>"
ProductList &= "<td><b>Quantity</b></td>"
ProductList &= "</tr>"
While Reader.Read
Dim newProduct As String
ProductList &= "<tr>"
ProductList &= "<td>" & Reader("Name") & "</td>" & _
"<td>" & Reader("Price") & "</td>" & _
"<td>" & Reader("Quantity") & "</td>"
ProductList &= "</tr>"
End While
ProductList &= "</table>"
End If
使用以下内容仅显示一条记录:
Dim CommandString As String
CommandString = "SELECT * FROM Product where ProductID =" & ProductID
我的目标是,如果您点击名称,它会将其链接到Link1.aspx并仅显示有关该名称的信息(表格中的信息)。这不会发生,因为程序崩溃了。我已经使用了所有基本的调试知识。
答案 0 :(得分:0)
首先,查看SqlParameters,因为您刚刚通过在QueryString中传递参数而将代码打开到SQL注入。
为了解决你的问题,我认为问题在于这一行:
"<td>" & "<a href=""Link1.aspx?ProdID=""" & Reader("Name") & ">" & Reader("Name") & "</a>" & "</td>" & _
您过早关闭双引号并且没有将productId放入href内。
我会像这样重写:
"<td>" & "<a href=""Link1.aspx?ProdID=" & Reader("Name") & """>" & Reader("Name") & "</a>" & "</td>" & _
微妙的差异,但它应该使它工作。
最后,在调用.ToString()
之前,始终对QueryString执行null /空字符串检查。使用QueryString
比较您的String.IsNullOrWhiteSpace()
条目,然后仅在String.IsNullOrWhiteSpace()
返回false时继续处理。
答案 1 :(得分:0)
在default.aspx.vb中你有:
"<td>" & "<a href=""Link1.aspx?ProdID=""" & Reader("Name") & ">" & Reader("Name") & "</a>" & "</td>" & _
将名称传递为ProdID 对于ProdID,您传递名称,在link1.aspx.vb中,您要查询:
Dim ProductID As String
ProductID = Request.QueryString("ProdID").ToString()'problem possible here
以后:
Dim CommandString As String
CommandString = "SELECT * FROM Product where ProductID =" & ProductID
期待ProdID,而不是名字。
因此,在default.aspx.vb中,您应该将行更改为:
<td>" & "<a href=""Link1.aspx?ProdID=""" & Reader("ProdID").ToString() & ">" &