在ASP.NETWebForms开发中,开发者经常需要使用ViewState来在页面的请求之间保持状态。然而,使用字符串索引来访问ViewState中的属性可能会带来一些不便。为了解决这个问题,引入了DynamicViewState类,它允许开发者使用动态属性而不是字符串索引来访问ViewState。
尽管使用动态属性访问ViewState提供了便利,但这种方法也有一些缺点。首先,它依赖于某个具体的基页面类。其次,它没有StateBag类的所有属性和方法。此外,将ViewState和ViewBag混合使用可能会给新开发者带来困惑。
为了克服这些问题,对进行了几项改进。首先,改变了构造函数,使其接受一个StateBag实例而不是Page类,这样DynamicViewState类就不需要嵌套在基页面类中。其次,添加了StateBag实现的所有接口,使其完全兼容StateBag类,可以简单地将基页面类中的新属性从ViewBag重命名为ViewState。这样,可以保留使用ViewState的旧代码,并为所有新代码使用新方法。
public partial class SamplePage : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
ViewState.loadCount++;
loadLabel.Text = string.Format("Load count: {0}", ViewState.loadCount);
}
else
{
ViewState["loadCount"] = 0;
loadLabel.Text = "Load count: 0";
}
}
}
要开始使用DynamicViewState,最简单的方法是使用Nuget包。可以在找到这个包。一旦将这个包添加到项目中,只需将页面的基类更改为BasePage,这就是需要做的所有事情。源代码可以在上找到。
动态实现的平均毫秒数:0.0003 非动态实现的平均毫秒数:0.00016
如所见,动态访问的速度大约是普通ViewState使用的两倍。