2010-03-18 43 views
2

可以说我有这应该有一个默认值的文本框....,它是在初始化函数,像这样:约ASP.Net回发的一些问题

void InitializeControls() 
{ 
    myTextBox.Text = "Default Text"; 
} 

现在,让我们说,我有一个按钮,它执行回发...我想将用户输入的文本框的值保存在按钮的OnClick事件中的某处。

我的问题是,我什么时候应该调用上面的初始化控制代码?我想它应该是在onload功能,但是这好像是我将覆盖回传数据,每次:

protected override void OnLoad(EventArgs eventArgs) 
{ 
    base.OnLoad(eventArgs); 

    InitializeControls(); 
} 

会回传数据覆盖上面,如果我有初始化代码在onload我的默认文本?

感谢

回答

2

呼叫InitializeControls()OnInit,调用base.OnInit()之前。通过这种方式,您的默认值将不会成为ViewState的一部分,您将不会将其传递给客户端,也无法无故返回。 您也可以在标记中(在.aspx文件中)设置默认值。

不是在PageLoad/OnLoad中调用InitializeControls(),因为这会将默认值添加到ViewState中,无缘无故地使用ViewState。

阅读文章TRULY understanding ViewState可以很好地理解这个东西。

4

文本框的用户输入的值将在回发期间,如果你通过调用在Page_Load中InitializeControl()手动设置文本丢失。

alt text http://i.msdn.microsoft.com/ms972976.viewstate_fig02%28en-us,MSDN.10%29.gif

每durilai的评论,一个!IsPostBack如果块要发生里面的代码仅发生在页面加载时的第一次:

if (!IsPostBack) { 
    InitializeControls(); 
} 
+0

所以我应该只设置默认值,如果它不是postBacK?关于动态控件呢? – Polaris878 2010-03-18 16:02:15

+0

除非你用if(!ispostback)包装它 – 2010-03-18 16:02:43

+1

在Page_Load中设置值会导致ViewState毫无理由地跟踪它,从而不必要地放大ViewState。在调用base.OnInit(在调用base.OnInit()ViewState开始跟踪更改之后)之前,应该在OnInit中设置默认值 – Rune 2010-03-18 16:17:00

2

我想你可能正在代码

if (!Page.IsPostBack) 

它允许您处理那些应该只发生在第一次加载的事情。

+0

所以何时回发值实际上被加载?如果控件是动态的呢? – Polaris878 2010-03-18 16:04:27

+0

我在问,因为我想知道我是否可以在OnInit中调用此函数或返回值只会覆盖默认值......这是理想的 – Polaris878 2010-03-18 16:06:17

+0

动态添加的控件将有所不同,具体取决于在何处您将它们添加到控件层次结构中的页面生命周期... – Paddy 2010-03-18 16:51:57

0

您也可以在标记中的文本框中设置默认值,然后您就不必担心在代码中设置默认值并检查回传。否则,Page_Load和OnLoad都是设置默认值的适当位置。你要检查,如果页面回发,如果是这样,就不会覆盖用户的价值:

if (!IsPostBack) 
    InitializeControls();