自定义控件中的一个属性
       用 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;
            }
        }
这个还要类型转化,浪费性能,可是我看好多开源项目多用这个,不明白,望知道的回答一下,谢谢

解决方案 »

  1.   

    ViewState是跨页面实例的。如果这个你不明白,那么你应该从页面实例对象的基本生命周期学起。我觉得这是学asp.net最基本的理论知识。可能你都是从那些“写个hello wold,用个TextBox、Button控件”的快速入门书学asp.net的。那些书不是任何理论书,不是专业书籍。页面处理“一瞬间”就完成了,然后页面就消失了。当客户端再请求这个页面处理的时候,服务器端实例化了同一页面的新实例,而不是原来那个,因此_resourceName中并没有原来写入的数据。
      

  2.   

    我随便搜到了几个早期文章:http://www.microsoft.com/china/MSDN/library/archives/library/DNAspp/html/aspnet-pageobjectmodel.asphttp://www.ccw.com.cn/htm/center/prog/02_3_12_2.asphttp://www.sj170.com/html/aspnet/00152406111000434550846744.htmlhttp://community.csdn.net/Expert/topic/5369/5369440.xml?temp=.6989862
      

  3.   

    客户端再请求这个页面处理的时候,还是会要从viewstate状态转化到string,如果不用viewstate,直接就是一个string类型的赋值,为什么还要转化一次呢??
      

  4.   

    如果不用ViewState,到哪里去取值?_resourceName吗?你自己测试测试看能取到值吗?
      

  5.   

    如果不用ViewState["ResourceName"] ,页面一刷新_resourceName 就取不到值了
      

  6.   

    晕 怎么会取不到值呢?
    我搞的是自定义控件<xx:xxx ResourceName="xx"...
    每次刷新页面就给ResourceName赋值xx
      

  7.   

    二楼解释的很清楚了,页面是相对于客户端来说的,对于服务器来说就一个类,ViewState的值是保存在客户端,每次postback时都传回给服务器,服务器处理好数所后的ViewState值传客户端,但是在这个过程是,页面这个对象被服务器重新初始化了,重新初始化的类只有他本身的定义,怎么会有你赋的值呢?
    public virtual String ResourceName
            {
                get
                {
                    Object state = ViewState["ResourceName"];
                    if (state != null)
                    {
                        return (String)state;
                    }
                    return "";
                }
                set
                {
                    ViewState["ResourceName"] = value;
                }
            }
    是个好方法,你是感觉不到他的速度的