/ / NullReference на об'єкт у коді позаду після AsyncPostBack за допомогою UpdatePanel - asp.net, ajax, vb.net, updatepanel, nullreferenceexception

NullReference на об'єкт у коді позаду після AsyncPostBack за допомогою UpdatePanel - asp.net, ajax, vb.net, updatepanel, nullreferenceexception

Я створюю просту гру у веб-додатку ASP.NET/VB.NET. У грі є інтерфейс, який складається з декількох ImageButtons.

Код веб-сторінки за файлом зберігає екземпляр до гра об'єкт, який буде керувати кожним поворотом, що виконується гравцями.

Все спрацювало, коли методи спільного використання об'єктів гри були розділені.

Проблема відбулося після рефакторингу, щоб зробити об'єкт гри, як екземпляр, замість спільного класу. Тепер, коли дія повертається до коду, екземпляр об'єкту гри становить нічого.

Я підозрюю, що це має якесь відношення до перегляду стану, але ... Google не допоміг.

Код бітів:

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

(З директиви сторінки)

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

(панель оновлень на веб-сторінці)

    <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>

Відповіді:

0 для відповіді № 1

Це не ViewState, це просто час життя _Default екземпляр

Ви створюєте примірник Game клас і зберегти його як член сторінки, і очікуємо, що екземпляр виживе. Проблема в тому, що екземпляр сторінки не виживає.

Кожен запит на сторінку призведе до нового екземпляра _Default клас, який буде створено, і коли створюється відповідь, екземпляр викидається. Посилання на екземпляр Game клас, який ви зберегли на сторінці, також викинуто, і ви втратите будь-який спосіб отримати доступ до нього.

Якщо ви хочете зберегти екземпляр Game клас, ви можете зберегти його в Session колекція, яка призначена для користувача:

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

Тим не менш, ви повинні бути скрутними щодо того, скільки визберігати в сеансі користувача. Зазвичай об'єкти, створені на сторінці, є недовговічними (тобто мілісекундами), тому вони мало впливають на ресурси сервера. Все, що ви зберігаєте в користувацькому сеансі, буде дуже довго жити в порівнянні. Подумайте, наскільки великий Game об'єкт є, і якщо вам дійсно потрібно зберегти весь об'єкт, або якщо ви можете зберегти лише інформацію, необхідну для її відтворення для кожного запиту.