【问题标题】:ASP.NET Page_Load is not firingASP.NET Page_Load 未触发
【发布时间】:2012-12-04 18:00:13
【问题描述】:

我创建了一个二维数组Board,包含GameCell 的对象。

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link rel="stylesheet" href="includes/css/style.css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>ארבע בשורה</h1>
        <div id="Board">
            <asp:Label ID="Label1" runat="server"></asp:Label>
            <asp:PlaceHolder ID="MyBoard" runat="server" />
        </div>
    </div>
    </form>
</body>
</html>

Default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    Game.CreateControls();
}

protected void Page_Init(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        Game.Set(MyBoard, Label1);
        Game.Reset();
    }
}

GameCell.cs:

public class GameCell : ImageButton
{
    public Position Position; // Justs holds the properties of Row and Col
    public CellType Type;

    public GameCell(Position Pos)
    {
        this.Position = new Position(Pos);
        this.Type = CellType.Empty;
    }
}

Game.cs:

public class Game
{
    public const int R = 6;
    public const int C = 9;

    public static GameCell[,] Board;
    public static PlaceHolder Holder;
    public static Label Log;

    public static CellType CurrentType;

    public static string[] Images = new string[] { "red", "empty", "blue" };

    public static void Set(PlaceHolder Holder, Label Log)
    {
        Game.Reset();
        Game.Holder = Holder;
        Game.Log = Log;
    }

    public static void CreateControls()
    {
        for (int i = 0; i < Game.R; i++)
        {
            for (int j = 0; j < Game.C; j++)
            {
                Game.Board[i, j].ImageUrl = Game.ImageUrlByType(Game.Board[i, j].Type);
                Game.Board[i, j].ID = i + "_" + j;
                Game.Board[i, j].Click += new ImageClickEventHandler(Image_Click);

                Game.Holder.Controls.Add(Game.Board[i, j]);
            }
        }
    }

    public static void Image_Click(object sender, EventArgs e)
    {
        int row = 0;
        int col = int.Parse(((GameCell)sender).ID[2].ToString());

        if (Game.Board[row, col].Type == CellType.Empty)
        {
            while (row < Game.R - 1 && Game.Board[row, col].Type == CellType.Empty)
            {
                row++;
            }

            Game.SetImage(row, col);
            Game.CurrentType = (CellType)(-(int)Game.CurrentType);
            Log.Text = col + " " + row + " " + Game.CurrentType;

            Game.Board[row, col].Enabled = false;
        }
    }

    public static void SetImage(int r, int c)
    {
        Game.Board[r, c].Type = Game.CurrentType;
        Game.Board[r, c].ImageUrl = Game.ImageUrlByType(Game.CurrentType);
    }

    public static void Reset()
    {
        Game.Board = new GameCell[R, C];
        Game.CurrentType = CellType.Blue;

        for (int i = 0; i < Game.R; i++)
        {
            for (int j = 0; j < Game.C; j++)
            {
                Game.Board[i, j] = new GameCell(new Position(i, j));
            }
        }
    }

    public static string ImageUrlByType(CellType t)
    {
        return "includes/images/" + Game.Images[(int)t + 1] + ".png";
    }
}

控件已呈现,并且在首次启动项目时可单击,但在我单击其中一个后,没有控件添加到我的 Holder (MyBoard)。

为什么会这样?

编辑:

我找到了解决方案。将MyBoard 作为参数传递给CreateControls 做到了。也许在 page_load 之后引用不再可靠(我将它保存在一个对象中)。

【问题讨论】:

    标签: c# asp.net events pageload page-init


    【解决方案1】:

    每次调用Page_Load 时,都会重新创建控件。它们存储在静态成员中,这意味着该网站的所有用户共享一个公共板。这真的是你想要的吗?将游戏存储在 Session 中不是更好吗? (当然我不知道你的要求,但我总是尽量避免在 Web 应用程序中使用静态成员)。

    一个可能的解决方案是在重新创建控件之前检查它是否不是回发。

    if (!IsPostback)
    {
    
    }
    

    【讨论】:

    • 我的第一次尝试是一个 Game 实例(具有非静态成员),但失败了,所以我认为静态成员会有所帮助。
    • 同意。 Web 应用程序中的静态成员(字段和属性)是个坏主意。数据将在具有不可预测结果的线程之间共享。 (静态方法很好。)
    • 实例成员在请求后丢失,静态成员在所有用户之间共享,并且可能被多个线程同时访问。您可以将您的游戏存储在 Session 变量中,然后每个用户都有自己的游戏,并且您不会遇到多线程问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多