我们都知道asp.net的服务端控件在呈现到浏览器的时候生成的代码还是HTML代码,但为何它就行保存上次输入的值呢?
      在设计的时候我们写一句<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>,但在页面代码中我们会看到<input name="TextBox1" type="text" id="TextBox1" />但还看到<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
      同样的代码,我只是把TextBox给一个初始化数据<asp:TextBox ID="TextBox1" runat="server" Text="this text value"></asp:TextBox>,在页面代码中会看到<input name="TextBox1" type="text" value="this text value" id="TextBox1" />和<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
      看了这两次生成的代码没什么变化,只是输入框的值变了,在浏览器中输入值后,回传了一次后代码也只是输入框的value改变了。
      在没有深入了解asp.net服务端控件的生成及其值的保存前,就以为它的值就只靠value属性,但后来发现没那么简单。每个控件的值都会保存到ViewState中。(这里我就不说太多有关ViewState了,因为自己研究得还不够深入,怕说错了)
      在项目开发中,我们经常用到日历控件,但服务端的日历控件要回传,刷新界面,这给用户使用感觉很不好,在网上有很多Js日历控件,直接可以使用的,但我们经常是不给用户手动输入,只能选择,在代码设计时一般是写<asp:TextBox ID="txtCalendar" ReadOnly="true" runat="server" onclick="showCalendar();"></asp:TextBox>没给它一个初始日期,它的值通过JS来填充的。当我们点击提交的时候,总得不到它的值,都是空串,就算是给了初始化日期,在浏览器中已经改变它的值,但提交到cs代码中,日期还是初始化的那个,这是怎么回来呢?
      把输入框设为只读后,也就只有后台cs代码才能修改这个输入的ViewState的值了。
      我们可以通过HiddenField代替它,在JS中修改输入框的值的同时也把它的值给一份给HiddenField,在后台的cs代码直接取得HiddenField的值就可了。这是个投机取巧的方法,在很多时候我们用JS在界面做的一些值的修改,回到cs代码里都得不到自己要得到的值,因为JS没有直接修改到ViewState,我们只能通过这些小方法得到。
      上面所说的不一定正确,如果那位朋友感得问题,请指入。谢谢!
posted on 2007-08-13 22:54  SouthSea  阅读(3221)  评论(16编辑  收藏  举报