梦想中国
付出最大努力,追求最高成就
昵称:
changchang
园龄:
4年4个月
粉丝:
1
关注:
0
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
远程桌面
(1)
随笔分类
ajax
(rss)
asp.net(10)
(rss)
html
(rss)
javascript(4)
(rss)
json
(rss)
other(5)
(rss)
project manage(1)
(rss)
sql server(1)
(rss)
随笔档案
2010年9月 (1)
2009年10月 (1)
2009年5月 (1)
2008年2月 (3)
2007年12月 (4)
2007年11月 (5)
2007年10月 (2)
2007年9月 (5)
积分与排名
积分 - 25530
排名 - 4135
最新评论
阅读排行榜
评论排行榜
推荐排行榜
Powered by:
博客园
模板提供:
沪江博客
博客园
|
首页
|
发新随笔
|
发新文章
|
联系
|
订阅
|
管理
asp.net控件本质
在我的一个项目中需要对于控件进行区分总结,我在网上找了找加上自己的实际测试总结如下:(如果有什么不正确的请即使指出,一起讨论,大家共同进步)
asp.net之所以现在开发方便和快捷,关键是它有一组强大的控件库,包括web服务器控件,web用户控件,web自定义控件,html服务器控件和html控件等。这里我主要说说html控件、html服务器控件和web服务器控件的区别。
1。html控件:就是我们通常的说的html语言标记,这些语言标记在已往的静态页面和其他网页里存在,不能在服务器端控制的,只能在客户端通过javascript和vbscript等程序语言来控制。
<
input
type
="button"
id
="btn"
value
="button"
/>
2。html服务器控件:其实就是html控件的基础上加上runat="server"所构成的控件.它们的注意区别是运行方式不同,html控件运行在客户端,而html服务器控件是运行在服务器端的。参考其他资料是这样说的:
当ASP.NET 网页执行时,会检查标注有无runat 属性,如果标注没有设定,那么Html标注就会被视为字符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果Html标注有设定runat="server" 属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将Html服务器控件的执行结果转换成Html标注,然后当成字符串流发送到客户端进行解释
<
input
id
="Button"
type
="button"
value
="button"
runat
="server"
/>
3。web服务器控件:也称asp.net服务器控件,是Web Form编程的基本元素,也是asp.net所特有的。它会按照client的情况产生一个或者多个html控件,而不是直接描述html元素。如:
<
asp:Button
ID
="Button2"
runat
="server"
Text
="Button"
/>
那么它和html服务器控件有什么区别呢?参照其他网页的资料看法如下:
1、 Asp.net服务器控件提供更加统一的编程接口,如每个Asp.net服务器控件都有Text属性。
2、 隐藏客户端的不同,这样程序员可以把更多的精力放在业务上,而不用去考虑客户端的浏览器是ie还是firefox,或者是移动设备。
3、 Asp.net服务器控件可以保存状态到ViewState里,这样页面在从客户端回传到服务器端或者从服务器端下载到客户端的过程中都可以保存。
4、 事件处理模型不同,Html标注和Html服务器控件的事件处理都是在客户端的页面上,而Asp.net服务器控件则是在服务器上,举例来说:
<input id="Button4" type="button" value="button" runat="server"/>是Html服务器控件,此时我们点击此按钮,页面不会回传到服务器端,原因是我们没有为其定义鼠标点击事件。
<input id="Button4" type="button" value="button" runat="server" onserverclick="test" />我们为Html服务器控件添加了一个onserverclick事件,点击此按钮页面会发回服务器端,并执行test(object sender, EventArgs e)方法。
<asp:Button ID="Button2" runat="server" Text="Button" />是Asp.net服务器控件,并且我们没有为其定义click,但是我们点击时,页面也会发回到服务器端。
由此可见:Html标注和Html服务器控件的事件是由页面来触发的,而Asp.net服务器控件则是由页面把Form发回到服务器端,由服务器来处理。
4。下面我就结合我自己的测试来说明问题:
这段代码是我放在repeat中的模板里的:其中DeleteCheck是一个js脚本函数,注意是用于是否发送到服务器端的,这里就不展示脚本代码了。
<
input
runat
="server"
type
="button"
id
="delete"
value
="Server button"
/>
<
input
type
="button"
onclick
="return DeleteCheck(this)"
id
="Button1"
value
="Client button"
/>
<
input
runat
="server"
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button2"
value
="Server submit"
/>
<
input
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button3"
value
="Client submit"
/>
<
button
runat
="server"
id
="button4"
onclick
="return DeleteCheck(this)"
value
="Button-Button"
>
Button-Button
</
button
>
<
asp:Button
runat
="server"
ID
="button5"
OnClientClick
="return DeleteCheck(this)"
Text
="Asp:button"
/>
展现出来的html代码如下:
<
input
name
="Data$ctl03$delete"
type
="button"
id
="Data_ctl03_delete"
value
="Server button"
/>
<
input
type
="button"
onclick
="return DeleteCheck(this)"
id
="Button1"
value
="Client button"
/>
<
input
name
="Data$ctl03$Button2"
type
="submit"
id
="Data_ctl03_Button2"
onclick
="return DeleteCheck(this)"
value
="Server submit"
/ >
<input ut
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button3"
value
="Client submit"
/>
<
button
id
="Data_ctl03_button4"
onclick
="return DeleteCheck(this)"
value
="Button-Button"
>
Button-Button
</
button
>
<
input
type
="submit"
name
="Data$ctl03$button5"
value
="Asp:button"
onclick
="return DeleteCheck(this);"
id
="Data_ctl03_button5"
/>
可以看出以下几点:
1。当控件属性中有runat="server"时,生成的html控件时name和id发生的变化(.net Framework)。
2。当asp:button服务器按钮通过生成的页面后转化成类型为submit类型的Client控件。
3。当控件是html控件时通过生成的页面和原来的html代码完全一样(理由上面已经说名)。
另外我还测试了把这段代码直接放到form标记中(不放到其他子标记中)如:
<
input
runat
="server"
type
="button"
id
="delete"
value
="Server button"
onserverclick
="delete_ServerClick"
/>
<
input
type
="button"
onclick
="return DeleteCheck(this)"
id
="Button1"
value
="Client button"
/>
<
input
runat
="server"
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button2"
value
="Server submit"
/>
<
input
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button3"
value
="Client submit"
/>
<
button
runat
="server"
id
="button4"
onclick
="return DeleteCheck(this)"
value
="Button-Button"
>
Button-Button
</
button
>
<
asp:Button
runat
="server"
ID
="button5"
OnClientClick
="return DeleteCheck(this)"
Text
="Asp:button"
OnClick
="button5_Click"
/>
<
asp:LinkButton
ID
="LinkButton1"
runat
="server"
OnClick
="LinkButton1_Click"
>
LinkButton
</
asp:LinkButton
>
直接放到form标记中生成的html代码
<
script type
=
"
text/javascript
"
>
<
!
--
var theForm
=
document.forms[
'
form1'];
if
(!theForm) {
theForm
=
document.form1;
}
function
__doPostBack(eventTarget, eventArgument) {
if
(!theForm.onsubmit || (theForm.onsubmit() !
=
false
)) {
theForm.__EVENTTARGET.value
=
eventTarget;
theForm.__EVENTARGUMENT.value
=
eventArgument;
theForm.submit();
}
}
//
-->
</
script
>
<
input
language
="javascript"
onclick
="__doPostBack('delete','')"
name
="delete"
type
="button"
id
="delete"
value
="Server button"
/>
<
input
type
="button"
onclick
="return DeleteCheck(this)"
id
="Button1"
value
="Client button"
/>
<
input
name
="Button2"
type
="submit"
id
="Button2"
onclick
="return DeleteCheck(this)"
value
="Server submit"
/>
<
input
type
="submit"
onclick
="return DeleteCheck(this)"
id
="Button3"
value
="Client submit"
/>
<
button
id
="button4"
onclick
="return DeleteCheck(this)"
value
="Button-Button"
>
Button-Button
</
button
>
<
input
type
="submit"
name
="button5"
value
="Asp:button"
onclick
="return DeleteCheck(this);"
id
="button5"
/>
<
a
id
="LinkButton1"
href
="javascript:__doPostBack('LinkButton1','')"
>
LinkButton
</
a
>
这里有可以看出几点:
1。当html服务器控件在服务器端添加了服务器事件后生成的代码变为:onclick="_doPostBack()",实际上是调用脚本把整个窗体提交到服务器(如果没有添件服务器事件而只是添加了runat="server"是不会发送到服务器端的)这里注意如果要在html服务器控件中添加一个客户端事件如上面的
<
input
runat
="server"
type
="button"
id
="delete"
value
="Server button"
onserverclick
="delete_ServerClick"
/>
变成
<
input
runat
="server"
type
="button"
id
="delete"
value
="Server button"
onclick="return DeleteCheck(this)" onserverclick
="delete_ServerClick"
/>
那样生成的html代码变成
<
input
language
="javascript"
onclick
="return DeleteCheck(this) __doPostBack('delete','')"
name
="delete"
type
="button"
id
="delete"
value
="Server button"
/>
提示有脚本错误原因是onclick事件执行了2个脚本且书写的格式不正确。onclick="return DeleteCheck(this);_doPostBack()"这样的话就只能执行第一个函数而第二个函数就不能执行了(return).如果用onclick="return DeleteCheck(this),_doPostback()"是指2个函数同时都要执行没有影响(相当于一条语句)。
2。控件的名字没有发生变化,这个问题我也不太明白为什么不发生变化,请高手门指教哈
3。asp:button中的onclientclick事件生成后就变成了onclick事件了,类型变成了type="submit".然而服务器事件的onclick我想是通过发送到服务器端执行的(具体我也不太很清楚)。
4。LinkButton不定义onclick事件,它会自动的生成下面代码发送到服务器端。
href="javascript:__doPostBack('LinkButton1',' ')"
以上是我对asp.net控件进行了简单的介绍。这只是我个人的观点总结,有什么不正确的希望朋友能够提出来,我们大家共同讨论,共同进步。
付出最大努力,追求最高成就。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
发表于 2007-09-27 01:34
changchang
阅读(4057)
评论(18)
编辑
收藏
评论
1809714
#1楼
回复
引用
查看
控件名字发生变化是因为 INamingContainer这个接口。这个接口没有任何方法,仅只作为一个标记。ASP.NET维护控件name和id生成的规律是:
NamingContainer爷爷$NamingContainer爸爸$该控件的ID
id则一般将$换为"_"
你把控件直接放到form下,它头顶唯一一个NamingContainer是Page,但是这个是特殊的逻辑,不会生成__Page_控件名,所以就只剩控件名了,于是ID看起来没有变化。
当你把控件放到Repeater中时,Repeater自己被INamingContainer标记,同时,每一次循环,它会把模板内的控件重新生成一遍,同时生成一个RepeaterItem, 把这些根据模板生成的控件加入RepeaterItem的子控件。这个RepeaterItem也是一个NamingContainer. 于是控件中就会带有:
RepeaterID(Data)_RepeaterItemID(ctl + 号码)_控件ID.
不过非runat=server控件因为不由ASP.NET维护, 不会发生变化. UserControl.ascx由于其基类也是一个NamingContainer, 所以如果你把控件放入.ascx, 然后在页面上引用, 则前面又会多一层UserControl的ID.
详细情况可能有出入, 但大体就是这么个过程, 多看MSDN就了解了.
#2楼
回复
引用
查看
如果想研究控件,用reflector看看System.Web.UI.Control以及各个派生类的代码吧。
#3楼
回复
引用
查看
这个非本质,这个是使用:)
#4楼
回复
引用
查看
吓了我一跳
#5楼
回复
引用
查看
onclick="return DeleteCheck(this),_doPostback()"中的逗号怎么加啊.
#6楼
回复
引用
查看
不错
#7楼
回复
引用
查看
标题党
#8楼
回复
引用
查看
我觉得还不错
#9楼
回复
引用
查看
--引用--------------------------------------------------
孙会生: onclick="return DeleteCheck(this),_doPostback()"中的逗号怎么加啊.
--------------------------------------------------------
JS 有这种写法吗?“,”也行?
还有楼主不要用这个标题了“本质”,看来绝对是“表面”怪怪的接近本质。
#10楼
回复
引用
查看
汗,这也算控件本质?这么表面的东西,看标题我还以为是说如何解释服务器端控件树的和ControlBuilder之类的呢
#11楼
回复
引用
查看
其实倒不如说说B/S模式的本质
管其是什么asp,asp.net,php,jsp,最终的结构不都得是浏览器能看得懂的html,css,javascript或者类似flash的那种object标记么.
#12楼
回复
引用
查看
也不错!支持!楼主..
#13楼
回复
引用
查看
虽然我也觉得这肯定离博客园大多数读者期望的“本质”有一定差距,但大家没必要一进来就直接打击楼主吧?我觉得楼主不是刻意去标题党的,他现在研究到这个层次就认为这是本质,这有什么错吗?难道你没经历过这个阶段?如果你觉得有更加值得研究的“本质”,可以留言建议楼主去了解一下。
#14楼
回复
引用
查看
同楼上. 谁想要比什么对控件本质的理解, 找我来比, 不要总让人家受刺激, 己所不欲, 勿施于人.
#15楼
回复
引用
查看
我觉得也算是本质了,各种脚本最后都是解释成html,十几年来没什么变化
#16楼
[
楼主
]
回复
引用
查看
谢谢Cat Chen支持我!在此表示感谢!其实我对控件的理解就只能达到这个层次,如果有什么不对和理解有问题的希望朋友们能及时给我回复!谢谢
#17楼
回复
引用
查看
虽然不算本质,不过还是挺好的文章。
#18楼
回复
引用
查看
mark
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
Chrome将给老机带来更快的3D绘图性能
·
在线支付创业公司Stripe获红杉资本等1800万美元的投资,公司估值达1亿美元
·
创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》
·
霍金的伟大与不幸
·
Linux为什么成功?因为它的失败是免费的!
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务