【问题标题】:ASP.NET Shopping CartASP.NET 购物车
【发布时间】:2011-02-07 16:02:53
【问题描述】:

我正在用 VB 后端在 asp.net 中构建一个非常简单的购物车,但我的代码遇到了问题。当我运行我的应用程序并尝试将产品添加到购物车时,我收到一条错误消息。

Object reference not set to an instance of an object. 

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

来源错误:

Line 27:         Dim blnMatch As Boolean = False
Line 28: 
Line 29:         For Each Me.objDR In objDT.Rows
Line 30:             If objDR("StockItemName") = Product Then
Line 31:                 objDR("Quantity") += txtQuantity.Text

我不确定它为什么这样做,并希望也许有人可以看看并提供一些建议?我检查了我的代码,没有发现任何错误,但是我会接受你可能对它有任何指导。

这是我的代码。

Shoppingcart.aspx

<asp:DropDownList id="ddlProducts" runat="server">

袜子 裤子 衬衫 帽子
数量:





全部的:

Shoppingcart.aspx.vb 导入 System.Data 部分公开课购物车 继承 System.Web.UI.Page

Dim objDT As System.Data.DataTable
Dim objDR As System.Data.DataRow
Private Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
    If Not IsPostBack Then
        makeCart()
    End If
End Sub
'Mark Cart function
Function makeCart()
    objDT = CType(Session("Cart"), DataTable)
    objDT.Columns.Add("StockID", GetType(Integer))
    objDT.Columns("StockID").AutoIncrement = True
    objDT.Columns("StockID").AutoIncrementSeed = 1

    objDT.Columns.Add("StockItemName", GetType(String))
    objDT.Columns.Add("StockItemValue", GetType(Decimal))
    Session("Cart") = objDT
End Function
'This is for adding items to the shopping cart.
Sub AddToCart(ByVal s As Object, ByVal e As EventArgs)
    objDT = Session("Cart")
    Dim Product As String = ddlProducts.SelectedItem.Text
    Dim blnMatch As Boolean = False

    For Each Me.objDR In objDT.Rows
        If objDR("StockItemName") = Product Then
            objDR("Quantity") += txtQuantity.Text
            blnMatch = True
            Exit For
        End If
    Next

    If Not blnMatch Then
        objDR = objDT.NewRow
        objDR("Quantity") = txtQuantity.Text
        objDR("StockItemName") = ddlProducts.SelectedItem.Text
        objDR("StockItemValue") = Decimal.Parse(ddlProducts.SelectedItem.Value)
        objDT.Rows.Add(objDR)
        Session("Cart") = objDT
    End If

    dg.DataSource = objDT
    dg.DataBind()
End Sub
Function GetItemTotal() As Decimal
    Dim intCounter As Integer
    Dim decRunningTotal As Decimal

    For intCounter = 0 To objDT.Rows.Count - 1
        objDR = objDT.Rows(intCounter)
        decRunningTotal += (objDR("StockItemValue") * objDR("Quantity"))
    Next

    Return decRunningTotal
End Function
Sub Delete_Item(ByVal s As Object, ByVal e As DataGridCommandEventArgs)

    objDT = Session("Cart")
    objDT.Rows(e.Item.ItemIndex).Delete()
    Session("Cart") = objDT

    dg.DataSource = objDT
    dg.DataBind()
    lblTotal.Text = "$" & GetItemTotal()
End Sub

结束类

【问题讨论】:

  • 会话中的购物车真的不为空吗?

标签: asp.net vb.net session shopping-cart


【解决方案1】:

我复制了您的代码并运行了几次并最终确定了它。 在初始页面加载 Session("Cart") 上什么都没有。向 DataTable 添加新列时导致对象引用错误。

像这样设置你的 DataTable 等于 Session("Cart") :

objDT = CType(Session("Cart"), DataTable)

会给它一个空值。相反,在初始页面加载时执行此操作:

objDT = New Data.DataTable

在设置完 Session("Cart") 之后,可以像以前一样将数据表设置为等于 Session("Cart")。

整个函数:

Function makeCart()
    objDT = New Data.DataTable
    objDT.Columns.Add("StockID", GetType(Integer))
    objDT.Columns("StockID").AutoIncrement = True
    objDT.Columns("StockID").AutoIncrementSeed = 1

    objDT.Columns.Add("StockItemName", GetType(String))
    objDT.Columns.Add("StockItemValue", GetType(Decimal))
    Session("Cart") = objDT
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多