有一個TextBox控件,將其EnableViewState屬性設為false,在腳本中改變其值,接著用window.event.returnValue=true來提交,請問此時TextBox控件中的值為何會保留下來

解决方案 »

  1.   

    我也想知道这个问题哎,难道是因为没有postback?
      

  2.   

    textbox是标准html控件,内容会自动保存的,跟viewstate没有关系
      

  3.   

    参考:http://topic.csdn.net/u/20081208/16/58254bf2-861f-4354-856a-17f581861aac.html
      

  4.   

    ASP.Net提供了EnableViewState属性,系统默认的值为true。当设置为true时,在传递状态值时就包括该控件;如果设置为false,则传递状态值时则不包括它。既然状态值不包括该控件,则客户端对它进行的操作,服务器端是不响应的。
      

  5.   

    如果此textbox控件有初始值,那會不會回到初始值去呢
      

  6.   


    不会。因为此时是PostData即客户端提交的<input type="text" value="...." ...>这里的value起作用,它被覆盖到TextBox控件的Text属性。不论是否关闭EnableViewState,你在服务器端任何一个事件中写代码取得的TextBox的Text最终结果都是客户端提交的值,而并不是ViewState中的值。我重新贴那个帖子中我的回复:
    ---------------------------------------------------------------------------------------------------实际上那个Text属性此时恰好可以不需要ViewState。当客户端向服务器提交数据,不但提交ViewState,也提交所有控件的值。在服务器端,首先是恢复了ViewState状态,紧接着设置了由客户端传来的值。........(删节一段话).......TextBox被转换为html输出到浏览器端(例如 <input type=text value='1234' />),客户端提交时服务器端实际上会读取这个value并设置到Text属性上。一个控件可能有几十个甚至上百个属性需要ViewState来保存,但是只有一个是用客户端的value来设置的。TextBox的Text恰好是这样既有ViewState又有value,而ViewState和客户端提交值是两个不同的机制,需要分别了解。 这里补充:服务器端不但读取ViewState来得知Text的上一次的值,还要读取value来看看客户端有没有提交新值。如果这两个不一样,就记录下来准备将来出发TextChanged事件。如果二者一样,就什么也不做。因此对于控件大部分状态值只有LoadViewState着一个过程,但是控件还要经历一个LoadPostData这个过程,从而为个别属性再用客户端提交的值覆盖同时判断是否触发xxxxChanged这类事件,这个过程你就还没有理解。当你将EnableViewState设置为false,TextBox已经不知道“上一次输出html时的默认值”了,因此在装载PostData时如果客户端看到的value值不是空串,即使客户端根本没有修改,它也总是触发TextBox的TextChanged事件。
      

  7.   

    在事件触发从而你的代码被执行之前,服务器端首先执行LoadView过程将所有控件的ViewState回复,然后再执行LoadPostData过程将客户端提交的修改针对各个控件的某一个用来就收value的属性进行覆盖。然后,你的事件代码才被执行,你读到的是Text属性是LoadPostData过程中覆盖了的值。如果你读取TextBox的ForeColor属性,由于TextBox的value仅仅是覆盖Text而并不覆盖到ForColor上,所以你得到的肯定是ViewState中的值。你是只知前一个设置属性值,忽视了后一个设置过程。
      

  8.   

    我们举出数据的例子:假设你在后台为TextBox的Text属性设置为"abc",那么页面输出html的时候会输出“<input type=text value="abc" id=....>”这样的html代码,然后客户端用户把它修改为“abcd”,当页面提交服务器端时,首先在LoadViewState过程中,这个TextBox的Text确实被恢复为"abc"了(注意不是"abcd"),然后所有控件的LoadViewState完成之后,开始了所有控件的LoadPostData过程。TextBox的LoadPostData过程仅仅去处理Text属性,它一看这个TextBox的客户端提交了新的值"abcd",跟"abc"不相等,于是记录下这个情况准备之后(在page_load完成之后)触发TextChanged事件,同时把"abcd"覆盖到Text属性上。你的代码之后取得的Text属性值就是这个"abcd"。而如果客户端没有修改,那么服务器端作为客户端提交"abc"来处理。而如果你设置EnableViewState为false,那么输出的代码没有变化,客户端修改并提交"abcd"到服务器端之后,服务器端执行LoadViewState时看到你设置了标志所以没有恢复ViewState到Text属性上,也就是说Text的值是创建TextBox对象时的默认值“空字符串”。接下来,LoadPostData会执行,它看到提交的"abcd"与空字符串不相等,也还是会准备好触发TextChanged事件,然后它还是会将"abcd"覆盖到Text属性上。而如果客户端没有修改,服务器端也还是作为客户端提交"abc"来处理,可见即使客户端没有修改这个字段,服务器端也总是会触发TextChanged事件。不论你是否设置EnableViewState,Text属性最终的值都是客户端提交的值而不是ViewState中的值。每一个控件,即使它有几百个状态属性值,它也最多只会有一个需要在postdata过程被覆盖的属性值。TextBox的Text属性恰好就是这样的。
      

  9.   

    可见即使客户端没有修改这个字段,服务器端也总是会触发TextChanged事件  -->      可见即使客户端没有修改这个字段,如果你禁用ViewState并且这个值不是空字符串,服务器端也总是会触发TextChanged事件