2012-02-20 13 views
0

ASP.NET/VB.NET Webアプリケーションで単純なゲームを構築しています。ゲームはいくつかのImageButtonで構成されたUIを持っています。UpdatePanelを使用したAsyncPostBackの後のコードビハインド内のオブジェクトのNullReference

ウェブページのコードビハインドファイルは、プレーヤーが撮影した各ターンを管理するゲームのゲームオブジェクトへのインスタンスを保持します。

GameオブジェクトのメソッドがSharedだったときはすべて機能しました。

ゲームオブジェクトを共有クラスの代わりにインスタンスとして動作させるために、リファクタリング後に問題が発生しました。アクションがコードビハインドに戻ると、ゲームオブジェクトのインスタンスはになりません。です。

これはビューの状態と関係していると思われますが、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

これはViewStateではなく、単に_Defaultインスタンスのライフタイムです。

Gameクラスのインスタンスを作成し、それをページのメンバーとして格納し、インスタンスが存続することを期待します。問題は、ページのインスタンスが存続しないことです。

ページのリクエストごとに、_Defaultクラスの新しいインスタンスが作成され、レスポンスが作成されるとインスタンスが破棄されます。ページに格納されているGameクラスのインスタンスへの参照も破棄され、アクセスできなくなります。

あなたがGameクラスのインスタンスを保持したい場合は、ユーザー固有であるSessionコレクション、それを保存することができます。しかし、あなたはあなたが保存どのくらいの程度carfulあるべき

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オブジェクトの大きさを考え、オブジェクト全体を本当に保持する必要がある場合、または要求ごとに再作成するために必要な情報だけを保持できる場合は、

関連する問題