我经常使用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" />
这也将在设计器中工作。 因此,对于遵循约定,(在大多数情况下)属性在回传之间保持不变是有道理的。