Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.Net中最小化ViewState大小,在构造函数中初始化控件值与在OnInit中初始化控件值之间是否存在差异?_C#_Asp.net_Viewstate_Default Value - Fatal编程技术网

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事件,而不是