Я створюю просту гру у веб-додатку 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
об'єкт є, і якщо вам дійсно потрібно зберегти весь об'єкт, або якщо ви можете зберегти лише інформацію, необхідну для її відтворення для кожного запиту.