C# 在ASP.Net中最小化ViewState大小,在构造函数中初始化控件值与在OnInit中初始化控件值之间是否存在差异?
好的,我正在试图了解如何最好地处理C# 在ASP.Net中最小化ViewState大小,在构造函数中初始化控件值与在OnInit中初始化控件值之间是否存在差异?,c#,asp.net,viewstate,default-value,C#,Asp.net,Viewstate,Default Value,好的,我正在试图了解如何最好地处理ViewState,以便使用C#对默认值进行编程设置。我知道ViewState隐藏字段的构造基于触发OnInit事件后设置的每个值。我不清楚的是,使用控件的构造函数还是使用OnInit事件来设置默认值之间是否存在差异 public MyControl(){ this.Text = "SomeDefaultValue"; } 对 protected override void OnInit(EventArgs e){ this.Text = "S
ViewState
,以便使用C#对默认值进行编程设置。我知道ViewState
隐藏字段的构造基于触发OnInit
事件后设置的每个值。我不清楚的是,使用控件的构造函数还是使用OnInit
事件来设置默认值之间是否存在差异
public MyControl(){
this.Text = "SomeDefaultValue";
}
对
protected override void OnInit(EventArgs e){
this.Text = "SomeDefaultValue";
}
我看到一些地方建议在给定属性的get
中测试null
的ViewState值,如下所示:
public string Text {
get {
return this.ViewState["Text"] == null ?
"SomeDefaultValue" :
this.ViewState["Text"] as string;
}
set { this.ViewState["Text"] = value; }
}
我不喜欢这样,因为它使清除值变得混乱
因此,使用构造函数与使用OnInit设置默认的
ViewState
值之间是否有功能上的区别?在最小化ViewState方面,没有区别,因为在运行OnInit
方法后ViewState开始跟踪
但是,还有一些功能上的差异:在初始化控件之前,您无法访问其他属性,如页面
。出于这个原因,我通常更喜欢使用OnInit
或绑定到Init
事件的某个处理程序
另外,在重写OnInit时要小心:您应该调用base.OnInit()
,以确保Init事件的其他事件处理程序仍然被调用
我强烈建议您阅读这篇关于此主题的优秀文章:
编辑
为了澄清,ViewState在为给定控件运行OnInit
方法后开始跟踪该控件。因此在给定的示例中,可以安全地覆盖OnInit
,如下所示:
protected override void OnInit(EventArgs e){
this.Text = "SomeDefaultValue"; // Make sure this happens before base.OnInit
base.OnInit();
}
这是因为Text
属性正在将值保存到此控件的ViewState。但是,假设您有另一个子控件(我将使用标签
作为示例)。调用控件的OnInit
方法时,该标签的OnInit
将已经运行。因此,如果要更改标签的文本值,则需要在该标签的OnInit阶段(或更早)进行更改
您可以在当前控件的构造函数中执行此操作:
public MyControl(){
this.Label.Text = "SomeDefaultValue";
}
。。。但正如前面提到的,您将无法访问外部控制结构,这在某些情况下可能是必要的。在这些情况下,一个好的替代方法是在标签本身上使用Init
事件处理程序。您可以在构造函数中连接事件处理程序本身:
public MyControl(){
this.Label.Init +=
(sender, e) => this.Label.Text =
((TextBox)Page.FindControl("SomeControl")).Text;
}
。。。但是,只有当控件直接声明为类的成员时,这才有效。如果标签位于模板内(如在转发器中),则需要使用标记将其连接起来:
<asp:Label runat="server" OnInit="Label_Init" />
后一个示例的优点是可以在我能想到的任何情况下工作,但它需要更多的样板代码,以及标记的更改。因此,请根据您的具体情况选择您的毒药。在最小化ViewState方面,没有区别,因为ViewState在运行
OnInit
方法后开始跟踪
但是,还有一些功能上的差异:在初始化控件之前,您无法访问其他属性,如页面
。出于这个原因,我通常更喜欢使用OnInit
或绑定到Init
事件的某个处理程序
另外,在重写OnInit时要小心:您应该调用base.OnInit()
,以确保Init事件的其他事件处理程序仍然被调用
我强烈建议您阅读这篇关于此主题的优秀文章:
编辑
为了澄清,ViewState在为给定控件运行OnInit
方法后开始跟踪该控件。因此在给定的示例中,可以安全地覆盖OnInit
,如下所示:
protected override void OnInit(EventArgs e){
this.Text = "SomeDefaultValue"; // Make sure this happens before base.OnInit
base.OnInit();
}
这是因为Text
属性正在将值保存到此控件的ViewState。但是,假设您有另一个子控件(我将使用标签
作为示例)。调用控件的OnInit
方法时,该标签的OnInit
将已经运行。因此,如果要更改标签的文本值,则需要在该标签的OnInit阶段(或更早)进行更改
您可以在当前控件的构造函数中执行此操作:
public MyControl(){
this.Label.Text = "SomeDefaultValue";
}
。。。但正如前面提到的,您将无法访问外部控制结构,这在某些情况下可能是必要的。在这些情况下,一个好的替代方法是在标签本身上使用Init
事件处理程序。您可以在构造函数中连接事件处理程序本身:
public MyControl(){
this.Label.Init +=
(sender, e) => this.Label.Text =
((TextBox)Page.FindControl("SomeControl")).Text;
}
。。。但是,只有当控件直接声明为类的成员时,这才有效。如果标签位于模板内(如在转发器中),则需要使用标记将其连接起来:
<asp:Label runat="server" OnInit="Label_Init" />
后一个示例的优点是可以在我能想到的任何情况下工作,但它需要更多的样板代码,以及标记的更改。因此,请根据您的具体情况选择您的毒药。关于ViewState有一个非常详细的文档: …服务器控件不开始跟踪 查看状态更改,直到右下角 初始化阶段结束。 第二,在添加动态控件时 需要利用视图状态,这些 在运行期间,需要添加控件 页面的Init事件与 加载事件
仅此一点,我想说,如果您正在使用ViewState,请使用OnInit有关ViewState的详细文档: …服务器控件不开始跟踪 查看状态更改,直到右下角 初始化阶段结束。 第二,在添加动态控件时 需要利用视图状态,这些 在运行期间,需要添加控件 页面的Init事件,而不是