2009-10-28 58 views
0

在一些书,我已经看到了他们保存这样的用户控件的自定义属性:在这样的视图状态用户控件的ViewState

private int id = 0; 
    public int ID 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     this.Page.RegisterRequiresControlState(this); 
    } 

    protected override void LoadControlState(object savedState) 
    { 
     object[] ctlState = (object[])savedState; 
     base.LoadControlState(ctlState[0]); 
     this.ID = (int)ctlState[1]; 
    } 

    protected override object SaveControlState() 
    { 
     object[] ctlState = new object[2]; 
     ctlState[0] = base.SaveControlState(); 
     ctlState[1] = this.ID; 
     return ctlState; 
    } 

我的问题是,为什么可以简单地存储它(在二传手):Vistate [ “ID”] = ID;
然后在那里检索它?

回答

2

ViewState的(你在你的问题说什么)和了ControlState-(什么是在示例代码中所示)之间的区别:可以通过关闭

  • 的ViewState UserControl的用户,通过设置EnableViewState="false"。在这种情况下,您将无法在下一个请求/回发期间恢复您的属性值(因为没有ViewState)。
  • ControlState无法关闭。这意味着,无论您在ControlState中存储什么,都将在下一次回发期间提供,因此您应该使用ControlState来处理在下一次请求/回发期间绝对需要能够检索的数据。

参见MSDN中的这些页面:从第一页ASP.NET ViewState OverviewControlState vs. ViewState

摘录:

除了查看状态,ASP.NET 支持控制状态。该页面使用 控制状态持久控制 必须在回发之间保留 的信息,即使页面或 控件的视图状态 被禁用。与查看状态一样,控制 状态存储在一个或多个隐藏的 字段中。

+0

你是什么意思“可以被你的UserControl的用户关闭”? 你的意思是在他的网页上使用这个控件的开发者?如果是,他也可以从用户控件中删除ControlState ... – samuel 2009-10-28 22:14:16

+0

无论谁在编写使用该控件的页面,都可以设置“EnableViewState”属性,该属性可以被禁用,而不是ControlState的情况, t财产将其关闭。 – 2009-10-28 22:28:45

+0

我仍然不明白,用户不是访问我的网站的“最终用户”,使用的是在他的页面上使用此控件的开发人员。如果他打算将它用于财产,他为什么应该关闭视图状态? – samuel 2009-10-28 22:30:11