Корзина ASP.NET

Я нахожусь в процессе создания очень простой корзины для покупок в asp.net с бэкэндом VB, но у меня возникают проблемы с моим кодом. Когда я запускаю свое приложение и пытаюсь добавить товар в корзину, я получаю сообщение об ошибке.

Object reference not set to an instance of an object. 

Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: 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

Я не уверен, почему он это делает, и надеялся, что, возможно, кто-то может взглянуть и дать какой-нибудь совет? Я проверил свой код и не нашел ничего неправильного, однако я бы воспользовался любым руководством, которое у вас может быть по этому поводу.

Вот мой код.

Корзина покупок.aspx

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

Носки Брюки Рубашка Шляпа
Количество:






Всего:

Shoppingcart.aspx.vb Импорт System.Data Partial Public Class Shoppingcart наследует 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

Конец класса


person Allan    schedule 07.02.2011    source источник
comment
Корзина в сеансе действительно не нулевая?   -  person Oskar Kjellin    schedule 07.02.2011


Ответы (1)


Я скопировал ваш код, прогнал его пару раз и понял. На начальной странице load Session("Cart") ничего нет. Вызывает ошибку ссылки на объект при добавлении нового столбца в DataTable.

Установка вашего DataTable равным сеансу («Корзина») следующим образом:

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

не даст ему никакой ценности. Вместо этого сделайте это при начальной загрузке страницы:

objDT = New Data.DataTable

После установки Session("Cart") вы можете установить datatable равным 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
person FarFigNewton    schedule 16.02.2011