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的主要设计目标之一。微软希望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