/ / NullReference na obiekcie w kodzie za AsyncPostBack przy użyciu UpdatePanel - asp.net, ajax, vb.net, updatepanel, nullreferenceexception

NullReference na obiekcie w kodzie za AsyncPostBack przy użyciu UpdatePanel - asp.net, ajax, vb.net, updatepanel, nullreferenceexception

Buduję prostą grę w aplikacji internetowej ASP.NET/VB.NET. Gra zawiera interfejs użytkownika złożony z kilku przycisków ImageButtons.

Kod strony za plikiem zawiera instancję gra obiekt, który będzie zarządzał każdą turą podjętą przez graczy.

Wszystko działało, gdy metody obiektu Gry zostały udostępnione.

Problem wystąpił po refaktoryzacji, aby obiekt gry działał jako instancja zamiast klasy współużytkowanej. Teraz, gdy akcja powraca do kodu z tyłu, instancja obiektu gry jest nic.

Podejrzewam, że ma to jakiś związek ze stanem widoku, ale ... Google nie pomógł.

Bity kodu:

Public Class _Default
Inherits System.Web.UI.Page

Private _gamePanel As Panel
Private _updatePanel as UpdatePanel
Private _game as Game

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not Page.IsPostBack Then

"create a new instance of the game object on first loading page
_game = New Game(width, height, cellsToWin)

End If

" DisplayGameBoard() does the following:
"  * Add images to the GameBoard panel inside of the GameBoardUpdatePanel
"  * Attach click event handler to each image (addressOf located in this
"      code behind file
"  * DisplayGameBoard() works fine the first time but fails on
"      subsequent post backs because there is no game object instance
Me.DisplayGameBoard()

End Sub

(Z dyrektywy na stronie)

Language="vb"
AutoEventWireup="false"
CodeBehind="Default.aspx.vb"
Inherits="Game._Default"
ValidateRequest="false"
EnableEventValidation="false"
EnableViewState="true"

(panel aktualizacji na stronie internetowej)

    <asp:UpdatePanel ID="GameBoardUpdatePanel"
runat="server"
UpdateMode="Conditional"
RenderMode="Block"
EnableViewState="true"
ViewStateMode="Enabled"
ChildrenAsTriggers="true" >

<ContentTemplate>

<asp:Label ID="PlayerName"
runat="server"></asp:Label>

<asp:Panel ID="GameBoard"
runat="server"
cssclass="gameBoard"></asp:Panel>

</ContentTemplate>
</asp:UpdatePanel>

Odpowiedzi:

0 dla odpowiedzi № 1

To nie jest ViewState, to po prostu czas życia _Default instancja.

Tworzysz instancję programu Game klasy i zapisz ją jako członka strony i oczekuj, że ta instancja przetrwa. Problem polega na tym, że instancja strony nie przetrwa.

Każde żądanie strony spowoduje powstanie nowej instancji _Default klasa, która zostanie utworzona, a po utworzeniu odpowiedzi instancja jest odrzucana. Odniesienie do instancji Game klasa, którą zapisałeś na stronie, jest również wyrzucana i tracisz jakikolwiek sposób na dostęp do niej.

Jeśli chcesz zachować instancję pliku Game klasa, możesz zapisać ją w Session kolekcja, która jest specyficzna dla użytkownika:

If Not Page.IsPostBack Then

"create a new instance of the game object on first loading page
_game = New Game(width, height, cellsToWin)
" store the reference in the user session
Session("game") = _game

Else

" get the reference back from the user session
_game = DirectCast(Session("game"), Game)

End If

Jednak powinieneś być zatroskany o ile tyzapisz w sesji użytkownika. Zwykle obiekty tworzone na stronie są krótkotrwałe (tzn. Milisekundy), więc mają niewielki wpływ na zasoby serwera. Wszystko, co przechowujesz w sesji użytkownika, będzie bardzo długotrwałe w porównaniu. Zastanów się, jak duże Game obiekt jest, i jeśli naprawdę potrzebujesz zachować cały obiekt, lub możesz zachować tylko informacje potrzebne do odtworzenia go dla każdego żądania.