当前位置:编程学习 > C#/ASP.NET >>

我滴神啊!天才们来讲解下Textbox控件怎么可以开发的这么完美???

今天我特意观察了一下Textbox的EnabledViewState为true 的情况,客户端生成的隐藏字段的大小,结果发现并没有变化。

然后当我把事件TextChanged加上之后,发现客户端生成的隐藏字段的大小开始大幅度增加。

也就是说,当你不用TextChanged事件的时候,即使EnabledViewState为true,系统也不会为Textbox实例的Text内容进行编码后增加到客户端的隐藏字段中去。只有当激活TextChanged事件的时候,才会进行编码并加入。

那么它究竟是如何实现的呢?

另外为什么我们在.aspx页面里面进行属性的赋值的时候,任何Textbox的属性即使在EnabledViewState为true 的情况下,也不会对属性的值进行编码后,然后增加到客户端的隐藏字段中去!只有在Page_Load方法中,进行代码编写赋值的情况下,才会进行编码并加入。

这一切究竟是为什么呢,怎么实现的呢? --------------------编程问答-------------------- 等天才讲解迷题 --------------------编程问答-------------------- <input type="hidden" name="__VIEWSTATE"
记录的就是各个控件和页面的状态信息。当用户对页面进行相关操作的时候,状态值发生改变,并将改变的值传递给服务器端。服务器端在比较改变后的状态值和初始值之间的区别,以响应具体的请求。
控件很多,传递控件状态值对网络的消耗很大
ASP.Net提供了EnableViewState属性,系统默认的值为true。当设置为true时,在传递状态值时就包括该控件 --------------------编程问答--------------------
引用 2 楼 wuyq11 的回复:
<input type="hidden" name="__VIEWSTATE"
记录的就是各个控件和页面的状态信息。当用户对页面进行相关操作的时候,状态值发生改变,并将改变的值传递给服务器端。服务器端在比较改变后的状态值和初始值之间的区别,以响应具体的请求。
控件很多,传递控件状态值对网络的消耗很大
ASP.Net提供了EnableViewState属性,系统默认的值为true。当设置为tr……


你好象没明白我说的意思,我的意思是说,假如我们回传页面,即使EnableViewState=true  系统也并不把这次递过来的Text的值做为隐藏字段发送到客户端,那么__VIEWSTATE的值当然也小很多。

只有当我们定义 OnTextChanged="TextBox1_TextChanged1" 的时候,系统才会把递过来的Text的值做为隐藏字段发送到客户端;而且__VIEWSTATE的值当然也大很多。


因为如果你没定义OnTextChanged="TextBox1_TextChanged1",系统知道你根本不会在意Text里面文本的变化,当然也就不会把Text的值做为隐藏字段发送到客户端,以方便你可以再次回传的内容进行比较。因为你没定义事件,没有这个必要!

所以,这是多么完美的做法啊,多么爱惜性能啊!!!

那么系统是如何作到的呢? --------------------编程问答-------------------- 厉害啊,今天是学习了 --------------------编程问答-------------------- 越研究越发现开发微软的asp.net真是做的太厉害了~ --------------------编程问答-------------------- 因为如果你没定义OnTextChanged="TextBox1_TextChanged1",系统知道你根本不会在意文本框里面文本的变化,当然也就不会把Text的值做为隐藏字段发送到客户端(以方便你对再次回传到服务器的文本框里的内容以及上次的内容进行比较)。因为你没定义事件,没有这个必要!
--------------------编程问答-------------------- 0oooooo --------------------编程问答-------------------- 0oooooo你个头呀! --------------------编程问答-------------------- 学学大话西游的台词,别见怪 --------------------编程问答-------------------- 这个是ASP.NET页面还回机制与脚本语言的完美结合,这里的脚本语言可能是(VBscript,JavaScript或Jcript) --------------------编程问答-------------------- 我顶! --------------------编程问答-------------------- 等待高手 --------------------编程问答--------------------
引用 3 楼 chaofd 的回复:
引用 2 楼 wuyq11 的回复:
<input type="hidden" name="__VIEWSTATE"
记录的就是各个控件和页面的状态信息。当用户对页面进行相关操作的时候,状态值发生改变,并将改变的值传递给服务器端。服务器端在比较改变后的状态值和初始值之间的区别,以响应具体的请求。
控件很多,传递控件状态值对网络的消耗很大
ASP.Net提供了EnableViewState……

楼主对于TextBox的数据回传机制还不太了解,首先TextBox的Text值可以不通过ViewState来获得还使用Request.Form的NameValueCollection   保存数据 
这是TextBox实现loadPostData方法
protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
 base.ValidateEvent(postDataKey);
 string text1 = this.Text;
 string text2 = postCollection[postDataKey];
 if (!this.ReadOnly && !text1.Equals(text2, StringComparison.Ordinal))
 {
  this.Text = text2;
  return true;
 }
 return false;
}




可以看到使用通过Request["表单名称"]的方法仍然可以得到值的
如果TextBox的ViewState被禁用,只是不会执行LoadViewState 跟SaveViewState方法,而这两个方法恰恰就是将服务器内容中的ViewState对象内容保存在<input type="hidden" name="__VIEWSTATE" value="...." />里面。但是同时内存中的ViewState对象还是可以使用的,可以证明如下:
private void Page_Load(object sender, System.EventArgs e)
{
 this.ViewState["test"]="test";
 this.Response.Write(this.ViewState["test"].ToString());
}
也就是说并不是写到<input type="hidden" name="__VIEWSTATE" value="...." />里面才是保存viewState的唯一途径。
可以参考下面TextBox的具体实现细节
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconpostbackdataprocessingsample.asp

另:楼主如果没定义TextChange方法,如果文本框的值改变后,在后台还是会有一个调用过程(事件委托),只是你没有定义
表单控件,如TextBox,CheckBox 都是类似的实现机制
--------------------编程问答-------------------- --------------------编程问答-------------------- 13楼正解。textbox即便禁用ViewState还是可以回传值的 --------------------编程问答-------------------- 学习了,长点见识。 --------------------编程问答-------------------- 13楼,你不明白我的意思


如果你不把前一次提交的文本框里的内容再发往 客户端 的隐藏字段中 ,那么,现在再一次提交表单发往服务器端,你怎么知道现在 这一次提交的内容 和前一次的内容 会有分别?

那么你怎么能引发 TextChange方法 ?

--------------------编程问答-------------------- 而现在如果你不定义TextChange方法 ,asp.net是根本不会把前一次提交的文本框里的内容压缩后发往客户端 的隐藏字段中的,除非你定义TextChange方法; 

asp.net的开发人员开发的可谓相当完美!!只是我具体没有发现实现这个功能的。 --------------------编程问答--------------------
我居然不知道有ViewState这个东西 --------------------编程问答-------------------- 路过,来瞧瞧 --------------------编程问答-------------------- 等待高手解答此完美的解决方案之原理! --------------------编程问答-------------------- ddd --------------------编程问答-------------------- 那个事件是处罚文本内容格式发生改变的先决条件,只有当该事件存在是,改变事件才能够触发 --------------------编程问答--------------------
引用楼主 chaofd 的回复:
这一切究竟是为什么呢,怎么实现的呢?


这一切非常简单,最主要的差别就是“工程”跟“学究”的差别。后者,总是纠结如何涉及才完美的问题。而前者,总是追求一小步一小步地改进,它追求简单。

比如asp.net项目组在我们身边,一个测试人员提交了一个bug,它认为当不需要处理Text的状态改变事件以及没有设置Visible属性为false时,就无需把这个值放入ViewState,那么asp.net项目里的某个产品经理就会写一个单元测试,这个单元测试以后的1年里会被同一个项目组各个开发人员运行了20万次,当任何其它改变都会同时回归验证这个测试用例是否仍然正确。在组织开发中有这种工程技术,那么你就可以每天、每小时地去开发测试用例,碰到任何bug都会停止手头工作去优先解决而不会拖延到下一周的开发工作中。

而像我们身边的某些项目组那样。简单粗糙地把界面分解一下就让各个程序员去“开发了”,然后过1个月才粗粗地口头了解一下“开发进度”,过好几个月才开始“联合”,才开始考虑手工测试。一大堆的问题都堆积起来,掩盖起来,因为害怕困难、或者害怕影响“进度”。这种项目中的某些人,肯定整天钻研怎么“完美开发”的理论,以为只能狂写文档才能保证产品可靠,而不相信摸着石头过河的人有更敏捷的设计和开发方法。 --------------------编程问答-------------------- sp1234,关键是他如何实现的?如何把“学究”精神体现在代码中呢? --------------------编程问答-------------------- 【另外为什么我们在.aspx页面里面进行属性的赋值的时候,任何Textbox的属性即使在EnabledViewState为true 的情况下,也不会对属性的值进行编码后,然后增加到客户端的隐藏字段中去!只有在Page_Load方法中,进行代码编写赋值的情况下,才会进行编码并加入。】
引用--

按你说的这样..那么编码的划分就在Page_load这个方法里了..编码与不编码取决于一个方法,这样你直接去看

Page_load方法怎么写的就行了


【也就是说,当你不用TextChanged事件的时候,即使EnabledViewState为true,系统也不会为Textbox实例的Text内容进行编码后增加到客户端的隐藏字段中去。只有当激活TextChanged事件的时候,才会进行编码并加入。】引用---

TextChanged 文本改变事件,那么编码的划分就在TextChanged 这个事件里了..编码与不编码取决于一个事件,建议从生命周期到看到视图状态...

至于你的提问是想问怎么实现...我没有回答你.. 只是说一堆废话..




--------------------编程问答-------------------- 好像没什么,viewstate的加密用了base64,在一定长度范围内加密的字符串不会增长。 --------------------编程问答-------------------- 学习了。。。。。 --------------------编程问答-------------------- 这个问题太难了。结帖吧 --------------------编程问答--------------------
引用 26 楼 wz361790599 的回复:
【另外为什么我们在.aspx页面里面进行属性的赋值的时候,任何Textbox的属性即使在EnabledViewState为true 的情况下,也不会对属性的值进行编码后,然后增加到客户端的隐藏字段中去!只有在Page_Load方法中,进行代码编写赋值的情况下,才会进行编码并加入。】
引用--

按你说的这样..那么编码的划分就在Page_load这个方法里了..编码与不编码取决于一个方法,这……


绝对不是在page_load里面!
我只是举一个例子而已!其在其他页面事件里也一样。

另外 ,“那么编码的划分就在TextChanged 这个事件里了”,说法也不对,事件只不过是一个代理,里面是没有任何代码的。

其次,也不在 --------------------编程问答--------------------
引用 27 楼 xhbmj 的回复:
好像没什么,viewstate的加密用了base64,在一定长度范围内加密的字符串不会增长。


那1000个字还不会变化吗 --------------------编程问答-------------------- 另外 ,“那么编码的划分就在TextChanged 这个事件里了”,说法也不对,事件只不过是一个代理,

我是不是应该写“那么方法的实现代码就在TextChanged 这个事件里”... 这样更符合你的理解思路... --------------------编程问答--------------------
引用楼主 chaofd 的回复:
今天我特意观察了一下Textbox的EnabledViewState为true 的情况,客户端生成的隐藏字段的大小,结果发现并没有变化。

然后当我把事件TextChanged加上之后,发现客户端生成的隐藏字段的大小开始大幅度增加。

也就是说,当你不用TextChanged事件的时候,即使EnabledViewState为true,系统也不会为Textbox实例的Text内容进行编码后增……


对不起,我有点不负责任...开始并没对你说的进行测试...只是按你说的分析..

你的第一个问题 在不在pageload里写属性值 我测试了一下 完全一样...测试的属性Tooptip width..毫无改变

第二个问题更夸张...也许你的文字描述太庞大..以至于让我很难理解...

'然后当我把事件TextChanged加上之后,发现客户端生成的隐藏字段的大小开始大幅度增加。'引用

自己分析一下 Enabledviewstate 为true的情况下是为了记录状态,你有加了textchanged事件,这个事件本身就是为了判断内容是否改变,如果你一开始就给textbox初始值,你又启用viewstate,肯定会记录textbox的初始值,所以大幅度增加... --------------------编程问答-------------------- 楼上的兄弟,你自所以没有看到区别,是因为你的属性值设置的不足够长,比如你在Page_Load里设置CssClass="abc"

你再测试下CssClass="abcbcadfkdfgdgabcbcadfkdfgdgabcabcbcadfkdfgdgabcbcadfkdfgdgabcbcadfkdfgdgabcbcadfkdfgdgabcbcadfkdfgdgabcbcadfkdfgdgabcbcadfkdfgdgbcaabcbcadfkdfgdgdfkdfgdgabcbcadfkdfgdg"

你就会发现结果的反差。

同样的, 如果你直接在aspx为控件属性赋值,是看不到任何差别的。

--------------------编程问答-------------------- 另外,即使一开始就给textbox初始值,又启用viewstate,但不定义事件,还是不会记录textbox的初始值的,就是这么神奇
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,