asp.net如何在服务器中从HTML构建对象

本文关键字:HTML 构建 对象 服务器 net asp | 更新日期: 2023-09-27 18:29:41

我在asp.net中构建了一个有几个按钮的页面。按钮是在页面加载事件中动态创建的。在第一次加载页面时(isPostBack=False),我给每个按钮一个文本,并将按钮添加到表单中。在PostBack上(点击按钮后),我只在表单中添加按钮。此外,服务器具有所有按钮的数组。问题是,在PostBack上,服务器如何知道并为创建的每个按钮提供正确的文本值(仅在第一页加载时提供,但在PostBack中,在创建按钮之前,按钮数组为空)?

这是一个代码片段-

protected Button[,] buttons;
    Table table;
    protected void Page_Load(object sender, EventArgs e)
    {
        buttons = new Button[4, 4];
        table = new Table();
        Form.Controls.Add(table);
        for (int i = 0; i < 4; i++)
        {
            TableRow row = new TableRow();
            table.Controls.Add(row);
            for (int j = 0; j < 4; j++)
            {
                TableCell cell = new TableCell();
                row.Cells.Add(cell);
                    buttons[i, j] = new Button();
                    //buttons[i, j].Attributes.Add("runat", "server");
                    buttons[i, j].Click += new EventHandler(b_Click);
                    cell.Controls.Add(buttons[i, j]);

            }
            //table.Controls.Add(row);
        }
        if (!Page.IsPostBack)
        {
            for (int i = 0; i < 4; i++)
            {
                createButtons(i);
            }
        }
    }
private void createButtons(int i)
    {
        for (int j = 0; j < 4 && i*j!=9; j++)
        {
            if (i * j == 9)
            {
                buttons[i, j].Width = 0;
                buttons[i, j].Height = 0;
            }
            Button b = buttons[i, j];
            buttons[i, j] = b;
            b.Height = 100;
            b.Width = 100;
            b.Font.Bold = true;
            b.Font.Size = FontUnit.XLarge;
            b.Text = randomNumber().ToString();
            b.BackColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255));
        }
    }

asp.net如何在服务器中从HTML构建对象

这种行为是asp.net的主要设计目标之一。微软希望asp.net的模式与桌面编程非常相似,这样人们就更容易过渡到使用web技术。其中的一个关键部分是抽象web的无会话特性,这就是为什么asp.net在请求之间保留控制初始化的原因。

Asp.net通过几种方式做到了这一点。最常见的是ViewState,它是存储在隐藏输入控件中的整个页面控制树的base64编码,并在每次请求时发送给客户端。如果检查发送到浏览器的HTML,您可以看到此字段。

另一种机制称为SessionState,它存储在服务器端。

Scott Mitchell有一篇关于View State内部运作的非常好的文章,你可以在这里阅读:http://msdn.microsoft.com/en-us/library/ms972976.aspx