每个变量与一个变量的视图状态



我经常使用viewstate来存储一些需要持久化回发的标志和小数据。大多数时候我都是这样使用它的

public partial class testPage : System.Web.UI.Page
{
    public string item1 { get { return (string)(ViewState["item1"] ?? default(string)); } set { ViewState["item1"] = value; } }
    public string item2 { get { return (string)(ViewState["item2"] ?? default(string)); } set { ViewState["item2"] = value; } }
    public string item3 { get { return (string)(ViewState["item3"] ?? default(string)); } set { ViewState["item3"] = value; } }
    public bool flag1 { get { return (bool)(ViewState["flag1"] ?? default(bool)); } set { ViewState["flag1"] = value; } }
    public bool flag2 { get { return (bool)(ViewState["flag2"] ?? default(bool)); } set { ViewState["flag2"] = value; } }   
    protected void Page_Load(object sender, EventArgs e)
    {
       // flag1...
    }
}

这很好,但看起来有点重,我不确定去旋转过程是只发生一次还是每次我访问变量时。所以我认为这种技术在绩效和管理方面可能更好一些

public partial class testPage : System.Web.UI.Page
{
    public PageVeriables Variables { get { return (PageVeriables)(ViewState["Variables"] ?? default(PageVeriables)); } set { ViewState["Variables"] = value; } }    
    protected void Page_Load(object sender, EventArgs e)
    {
      //Variables.flag1..
    }
}
[Serializable]
public class PageVeriables
{
    public string item1 { get; set; }
    public string item2 { get; set; }
    public string item3 { get; set; }
    public bool flag1 { get; set; }
    public bool flag2 { get; set; }
}

问题是,一个真的比另一个有什么好处吗?

我建议做第一个示例,即使它可能更类型化。

它有两个明显的优势:

首先是Michael Liu所说的,即ViewState的大小具有更多的粒度。 如果仅使用 10 个属性中的 2 个,则 ViewState 大小仅占实际分配给的 2 个属性。

第二个我觉得更重要的是,它遵循与UserControls相同的模式,因为它们具有您分配给的属性。 例如,给定具有 Text 属性的用户控件,在 ASPX 中使用用户控件将如下所示:

<demo:MyUserControl Text="Some Text" runat="server" />

这也将在设计器中工作。 因此,对于遵循约定,(在大多数情况下)属性在回传之间保持不变是有道理的。

最新更新