.net中的FORM机制
2007-11-23 09:52 Eugene Wang 阅读(710) 评论(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属性值永远为本页。