代码改变世界

.net中的FORM机制

2007-11-23 09:52  Eugene Wang  阅读(706)  评论(2编辑  收藏  举报

     一直想搞清加了runat="server"的FORM和没加这个属性的FORM有啥区别,今天试验了一下,似乎搞明白了点儿东西。
    先建了一个项目,把页面中<body>的内容全删了,然后写如下几行HTML
    <body>
         <form id="mForm">
         <div>
         <label for="txtOne">messageOne:<>   
         <input type="text" id="txtOne" name="txtOne"/>
         </div>
         <div>
         <label for="txtTwo">
         <input type="text" id="txtTwo" name="txtTwo"/>
         </div>
         <input type="submit" id="  submit  "/>
         </form>
    </body>
为了测试数据是否被提交成功,在页面的PageLoad事件处理程序中写入
    if(Request.Form["txtOne"]!=null || Request.Form["txtTwo"]!=null)
        {
            Response.write("One:"+Request.Form["txtOne"]+"<br/>");
            Response.write("Two:"+Request.Form["txtTwo"]+"</br>");
        }
动行,在文本框中输入数据后提交,提交成功,查看页面源代码时,才发现form的action和method属性都没设置,想想才知道,action属性的默认值应该是本页,method默认的值是get。
       停止运行,然后在form里面添加runat="server"属性,再一运行,发现跟没加时一样,没有什么改变。查看一下源代码,突然发现在在输出的源代码里多了一行
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGR/8ZxOm5Tn0sfHNJaqE12hKqqJTQ==" />这个东西,嘿,这不就是传说中的viewstate吗。原来这就是.net中的FORM跟HTML中FORM的区别。
        后来又测试了几次,发现viewstate是通过HTML控件的name属性来跟踪HTML控件中的数据,这就是为什么在HTML控件中输入数据时也能显示以前曾经输入过的数据。假如FORM没有加runat="server"属性的话,HTML控件就不会有这样的效果了。如果FORM加了runat属性,则它的action属性便会失效,或者说action属性值永远为本页。