代码之家  ›  专栏  ›  技术社区  ›  CodexArcanum

对于ASP.NET ViewState,在生命周期中何时访问ViewState是否有最佳实践?

  •  2
  • CodexArcanum  · 技术社区  · 14 年前

    在构建自定义控件中,我看到了两种使用视图状态的模式。一种是使用属性将视图状态访问伪装为持久数据。

       public bool AllowStuff
       {
           get
           {
               return (ViewState[constKeyAllowStuff] != null) ?
                   (bool)ViewState[constKeyAllowStuff] : false;
           }
           set { ViewState[constKeyAllowStuff] = value; }
       }
    

    另一种方法是使用私有成员字段,重写控件上的Load/SaveViewState方法,并显式处理所有这些方法:

     protected override object SaveViewState()
     {
         object[] myViewState = new object[2];
         myViewState[0] = base.SaveViewState();
         myViewState[1] = _allowStuff;
         return myViewState;
     }
    
     protected override void LoadViewState(object savedState)
     {
         object[] stateArray = (object[])savedState;
         base.LoadViewState(stateArray[0]);
         _allowStuff = (bool)stateArray[1];
     }
    

    (为了清晰起见,我删去了很多安全检查,所以忽略了这一点。)

    一种方法比另一种方法有特别的优势吗?我看不出他们在性能方面有什么不同。版本1是懒惰的,所以我想如果您在一次传递中不需要那个特定的值,您可以节省一点。版本1也更抽象,更好地隐藏细节。版本2更清楚地说明了数据何时是有效的,并且可以读取或修改(在加载和保存之间),因为它在ASP.NET生命周期内更清晰地工作。

    版本2确实需要更多的样板代码(一个属性、一个支持私有字段和两个地方的视图状态处理),而不是版本1将所有这些合并到一个地方。

    然后思考?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Brian Mains    14 年前

        2
  •  1
  •   Poker Villain    14 年前