日期:2014-05-20  浏览次数:20402 次

问一个viewstate的问题
自定义控件中的一个属性
              用 public   string   ResourceName
{
get   {   return   _resourceName;}
set   {   _resourceName   =   value;}
}
这个不就可以了吗?为什么还用下面这种写法?
                public   virtual   String   ResourceName
                {
                        get
                        {
                                Object   state   =   ViewState[ "ResourceName "];
                                if   (state   !=   null)
                                {
                                        return   (String)state;
                                }
                                return   " ";
                        }
                        set
                        {
                                ViewState[ "ResourceName "]   =   value;
                        }
                }
这个还要类型转化,浪费性能,可是我看好多开源项目多用这个,不明白,望知道的回答一下,谢谢

------解决方案--------------------
ViewState是跨页面实例的。

如果这个你不明白,那么你应该从页面实例对象的基本生命周期学起。我觉得这是学asp.net最基本的理论知识。可能你都是从那些“写个hello wold,用个TextBox、Button控件”的快速入门书学asp.net的。那些书不是任何理论书,不是专业书籍。

页面处理“一瞬间”就完成了,然后页面就消失了。当客户端再请求这个页面处理的时候,服务器端实例化了同一页面的新实例,而不是原来那个,因此_resourceName中并没有原来写入的数据。
------解决方案--------------------
二楼解释的很清楚了,页面是相对于客户端来说的,对于服务器来说就一个类,ViewState的值是保存在客户端,每次postback时都传回给服务器,服务器处理好数所后的ViewState值传客户端,但是在这个过程是,页面这个对象被服务器重新初始化了,重新初始化的类只有他本身的定义,怎么会有你赋的值呢?
public virtual String ResourceName
{
get
{
Object state = ViewState[ "ResourceName "];
if (state != null)
{
return (String)state;
}
return " ";
}
set
{
ViewState[ "ResourceName "] = value;
}
}
是个好方法,你是感觉不到他的速度的