回发问题

时间:2010-06-19 11:50:39

标签: c# asp.net

行。我这样问这个问题: 通常,不是页面循环:

的Page_Load

onclick和/或提交处理程序

的Page_Load。

如果是这样,在onclick / submit处理程序期间页面上的控件值应该是多少?用户选择的值,或page_load?

中的值

2 个答案:

答案 0 :(得分:2)

页面加载事件在控件事件之前触发。因此,如果更改页面加载事件中的值,则这些更改将覆盖用户选择的任何值,并且在控件事件中,您将看到在页面加载中设置的值。

如果你需要在页面加载事件中进行一些初始化,但只有当有人第一次进入页面时,你可以使用IsPostBack:

if(!IsPostBack)
{
  //do initialization that you only want to happen when someone
  //comes to the page for the first time
}

这是一个很好的overview of the ASP.NET page lifecycle,其中包含更多细节。

以下是一个简化的示例序列:

  1. 浏览器请求页面
  2. Page Load fires
  3. 页面渲染并发送到浏览器
  4. 用户在页面上执行某些操作(单击按钮,更改设置为autopostback的文本框等)
  5. 浏览器对页面进行POST
  6. 页面加载(再次)。这次IsPostBack是真的。另请注意,这与#2中的“Page”对象不同。每个HTTP请求都是一个全新的Page对象。例如,成员变量不会跨请求保存。
  7. 触发适当的控制事件(点击,更改文字等)
  8. 页面渲染并再次发送回浏览器

答案 1 :(得分:0)

这取决于您是否检查该页面是否为回发。

考虑以下示例 - 系统用户有机会在webform上更改其名称。页面加载时,用户名称将显示在文本框中的页面上。然后,用户可以单击按钮以保存其名称。

在此示例中,假设名为“John Smith”的用户将其用户名错误地存储为“John Jones”。然后他决定通过在用户名字段中输入“John Smith”来更改用户名。

protected void Page_Load(object sender, EventArgs e)
{
this.txtName.Text = "John Jones";
}

protected void SaveDetails(object sender, EventArgs e)
{
string username = this.txtName.Text;
}

在这种情况下,您可能希望字符串用户名现在设置为“John Smith”。 但是,当页面在回发时再次加载时,它实际上会重置为“John Jones”。

因此我们必须检查该页面是否为回发。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostback)
    {
    this.txtName.Text = "John Jones";
    }
}

现在,用户名字符串将按照用户的意图设置为“John Smith”。