在页面加载中实现IsPostBack

时间:2010-09-01 18:09:08

标签: asp.net events controls postback

我使用的ASP.NET越多,if (!IsPostBack) {}似乎就越没有意义......

第一个例子:

例如,我只是用谷歌搜索了一个问题,他们说这是解决方案的一部分:

if (!Page.IsPostBack)
{
   Page.LoadComplete += new EventHandler(Page_LoadComplete);
}

与编码完全相同,LoadComplete仅在第一次加载时触发。单击按钮或触发回发的任何内容后,LoadComplete事件将取消挂钩,从而跳过事件处理程序。因此,他们的“修复”仅适用于第一次加载=毫无价值。我及时评论了if (!Page.IsPostBack) {},现在事件总是按照需要触发。

第二个例子:

我正在尝试将事件挂钩到动态创建的按钮(顺便说一下,我无法开始工作[GRR!])。我看到示例显示:

myEditToggleButton = new Button();
myEditToggleButton.ID = "editToggleButton"; 
//^GOTTA HAVE THIS FOR EVENTS TO WORK! (supposedly, I haven't seen it work...)
if (!IsPostBack)
{
   myEditToggleButton.Click += new EventHandler(myEditToggleButton_Click);
}
Controls.Add(myEditToggleButton);

与第一个示例一样,我的理解是在第一次加载页面后不会挂起事件,因此单击一下按钮就是“惰性”(因为点击触发了回发)。

问题:

什么时候应该使用if (!IsPostBack) {}?我猜它只与标记创建的控件有关。

8 个答案:

答案 0 :(得分:17)

简而言之,每次只需要首次加载时就可以使用它。

Page.IsPostBack的经典用法是数据绑定/控件初始化。

if(!Page.IsPostBack)
{
   //Control Initialization
   //Databinding
}

ViewStateControlState上保留的内容不需要在每次回发时重新创建,因此您需要检查此条件以避免执行不必要的代码。

另一个经典用法是获取和处理Querystring参数。你不需要在回发时这样做。

答案 1 :(得分:6)

如果不需要重复第一次以外的操作。

将它用于昂贵的操作(例如从数据库获取数据或填充ListItems),这些操作必须在第一次加载页面或控件时执行。如果页面已发布到服务器然后重新加载,则无需重复该操作。通过测试IsPostBack的值,您可以跳过昂贵的操作,

答案 2 :(得分:4)

用于处理表单数据。

如果您想处理POSTed数据,您只想在页面实际发布数据时执行此操作,而不是首次加载。因此,IsPostBack标志。

答案 3 :(得分:3)

如果导致回发会发生什么情况,您可以更改控件的状态,而无意义。例如,在使用网格视图时,如果在编辑模式下回发,您将无法再访问编辑的字段。

当您点击服务器时,通常需要保护信息不会在页面上消失,这就是

if(!Page.IsPostBack)

答案 4 :(得分:1)

每当事件被触发时,您的事件处理程序都应该连线(不论PostBack状态如何)

此外,在动态添加控件时,请务必遵守asp page lifecycle

答案 5 :(得分:1)

protected void Page_Load(object sender, EventArgs e)            
{
    if (!IsPostBack) { 
        SqlConnection conn = new SqlConnection("Data Source=-----; Database=-----; Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter();
        conn.Open();
        da.SelectCommand = new SqlCommand("Select Command",conn);
        conn.Close();
        DataTable dt = new DataTable();
        da.Fill(dt);

        ddlSearch.DataSource = dt;
        ddlSearch.DataTextField = "---";
        ddlSearch.DataValueField = "---";
        ddlSearch.DataBind();
    }
}

答案 6 :(得分:0)

此外,如果要初始化控件,则必须使用IsPostBack,否则它们将在每次加载时恢复为默认值。这会使用户感到困惑,因为当他们尝试使用表单时,他们输入的值将重置为您的默认值。

答案 7 :(得分:0)

首先,您需要了解在Visual Studio中启动项目时回发的内容,
如果您有if statement检查isPostBack方法中truefalse还是Page_Load,那么isPostBack是{{} 1}},表示它不是false,那么回发是什么,
现在点击一个postback(如果你没有按钮,请添加一个按钮点击方法),此时,你发回一个请求回服务器,然后服务器响应,这个过程是所谓的button,通过点击postback

来触发

您需要注意的一件事是,button方法将再次执行,不仅会执行Page_Load方法,所以现在,Button_click为{{1} ,表示它是回发,是的,它确实是一个回发,因为你点击了按钮。