仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 762|回复: 11
打印 上一主题 下一主题

[学习教程] ASP.NET编程:由ASP.NET所谓前台挪用背景、背景挪用前台想到HTTP――理论篇(二)仓酷云 ...

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。在由ASP.NET所谓前台挪用背景、背景挪用前台想到HTTP——实际篇中形貌了一下ASP.NET老手的三个成绩及相干的HTTP协定内容,在由ASP.NET所谓前台挪用背景、背景挪用前台想到HTTP——理论篇(一)中已解答了关于服务器怎样改动页面元素或“挪用”JavaScript的成绩,为了不上篇锣乱淮笸疲獯沃北贾魈——ASP.NET前台怎样挪用背景办法
成绩细化

所谓前台挪用背景这类成绩的提出不过是由于良多老手受了ASP.NET服务器端控件的“误导”,你不是说前台没有把JavaScript语句、页面元素甚么的传到背景,以是前台挪用背景,大概背景监督页面变更是扯淡嘛!那ASP.NET中为何服务器端控件一点击就可以挪用背景制订办法呢?依照你后面的实际即便用了服务器端控件,那末到了扫瞄器页面也酿成最一般不外的HTML文本了,怎样还可以挪用服务器端办法呢?!
的确,扫瞄器出现的是HTML文本,我们先不必拘泥于ASP.NET怎样做到的前台“挪用”背景,我们能够本人完成一下,不外在此之前我们得分明一些过于Post的成绩
复杂聊聊Post

我们在看良多网页的时分城市看到如许的内容
  1. <formid="form1"method="post"action="Default.aspx"><inputtype="text"name="wd"/><inputtype="submit"name="test"value="test"/></form>
复制代码
这段HTML文本同砚们都能看懂,页面上有一个form,form内有两个input,点击submit的时分,页面form内容会以post体例被提交到Default.aspx这个页面。
HTTP协定中的Post办法会将所处的form提交到form指定页面,假如form指定的办法为post(还多是get等),那末form内有些数据会一并被提交。
既然不是全部form被提交,那末哪些数据会被提交呢?
1.input的name和value
2.inputtype=”submit”只要被点击的时分才将其自己name与value提交
3.关于多个name不异的inputtype=”checkbox”,只要选中项的值会被提交(多个value以,毗连)
4.关于多个name不异的inputtype=”radio”,只要选中项的value会被提交(同名的radio只能单选)
5.select的name和被选中的option的vaue(不是option的text)
6.textarea的name与value
如许被提交的数据能够在提交的页面的背景中以Request.Form[“name”]的体例查到其值
inputtype=”submit”“挪用”背景办法

晓得了form和post的最基础常识,我们就能够摹拟ASP.NET的button挪用背景办法了,起首筹办如许一个页面
  1. <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>
复制代码
在背景增加想挪用的办法
  1. protectedvoidtest_Click(objectsender,EventArgse){Response.Write("ButtonClick!");}
复制代码
很复杂的内容,背景办法的两个参数完整能够不必(和事务有关),填上只是为了增添其传神性,代码中有几个必要注重的中央
1.form的办法必要设为post,这个很分明。。。
2.form的action设为页面自己,也就是让页面提交给本人
3.input要有name
筹办事情做好后就能够摹拟JavaScript挪用背景办法了,在页面的OnLoad办法中写进代码

  1. protectedoverridevoidOnLoad(EventArgse){if(Request.Form["test"]!=null){test_Click(this,newEventArgs());}base.OnLoad(e);}
复制代码


伶俐的同砚一定能够看出眉目了,在点击test的时分会提交表单,页面的OnLoad会主动实行,这时候候会判别提交过去的表单中是不是包括test(submit被点击后会被提交,不点击不提交,以是能够依据name能够判别出哪一个按钮被按了),就这么复杂,点击submit的时分,预界说的办法就被挪用了,如果页面上有良多submit,这时候候就必要if-else大概switch大概for如许的工具来判别究竟是哪一个submit被点击了,然后挪用对应办法。
asp:button

对照一下,ASP.NET恰好用,起首人家的from是如许的
  1. <formid="form1"runat="server"></form>
复制代码
人家主动就给render成如许了

我们也不必要本人在OnLoad中增加if-else,只需在control的属性中增加OnClick=”XXX”就能够了,我没看过.NET源码,可是我勇敢的忖度,固然不必再OnLoad里if-else了,但应当也是相似的体例处置。
不主动提交表单的怎样办

仔细的同砚大概要问了,你这么做是能够,可是依附于表单提交,我们晓得并非一切的页面元素城市点一下就提交表单,像控件asp:DropDownList的OnSelectIndexChanged事务,人家也会挪用回台办法,那是怎样做的?
实在十分复杂,关于这类需求,仍旧能够用表单提交的体例处置,不克不及主动提交表单,那末我们能够用JavaScript匡助其提交,看个selectchange“挪用”背景函数的例子,起首像如许修正页面,增加一个select

  1. <formid="form1"method="post"action="Default.aspx"><inputtype="hidden"id="__param"name="__param"/><inputid="test"name="test"type="submit"value="test"/><selectid="select1"name="select1"><optionvalue="0">0</option><optionvalue="1">1</option><optionvalue="2">2</option></select><scripttype="text/javascript">document.getElementById(select1).onchange=function(){document.getElementById(__param).value=this.name;document.getElementById(form1).submit();};</script></form>
复制代码


我们除select元素还增加了两个内容,一个inputtype=”hidden”的埋没元素,一段JavaScript剧本,在JavaScript剧本中对select的onchange绑定了一个办法,当select选择项变更的时分,把其name赋值给埋没域的value,然后提交表单,因为埋没域可定会被提交,如许我们能够一样在页面的Onload中判别谁的onchange触发了,然后挪用预界说办法,背景代码是如许的

  1. protectedoverridevoidOnLoad(EventArgse){stringparam=Request.Form["__param"];if(Request.Form["test"]!=null){test_Click(this,newEventArgs());}elseif(param=="select1"){select_Change(this,newEventArgs());}base.OnLoad(e);}protectedvoidtest_Click(objectsender,EventArgse){Response.Write("ButtonClick!");}protectedvoidselect_Change(objectsender,EventArgse){stringnewValue=Request.Form["select1"];Response.Write("Seclectvaluechanedto"+newValue);}
复制代码


是否是很复杂呢?先判别是否是submit,不是的话判别埋没域,射中后挪用预界说办法。
仔细的同砚仍旧会发明成绩,如果一个元素上同时又两个事务怎样办?好比还想对这个select增加cilck事务怎样办,这时候候我们能够修正埋没域的值,不但纪录name,还记上事务范例,相似如许

  1. document.getElementById(select1).onchange=function(){document.getElementById(__param).value=this.name+"$onchange";document.getElementById(form1).submit();};document.getElementById(select1).onclick=function(){document.getElementById(__param).value=this.name+"$onclick";document.getElementById(form1).submit();};
复制代码


然后在背景判别的时分,我们能够先把参数按$支解为两个字符串,分离判别元素与事务范例,固然我们也能够再增加一个埋没域,用来记事务范例,迥然不同。
另有同砚回问,假如我在客户端一样写了select的onclick,不就把你的代码掩盖了吗?如许我就不克不及post了,关于这个成绩我们年夜能够换种体例绑定事务处置程序,用addEventListener(attachEven)的体例,如许post的代码和本人写的客户真个就能够同时存在了,如许

  1. varselect=document.getElementById(select1);select.onclick=function(){//////};select.addEventListener(clcik,function(){//扫瞄器兼容性成绩要处置,这里就不演示了document.getElementById(__param).value=this.name+"$onclick";document.getElementById(form1).submit();},false);
复制代码


asp:DropDownList

我们能够看看ASP.NET是怎样处置的,在页面上写一个DropDownList,设起AutoPostBack属性为true

  1. <formid="form1"runat="server"><asp:DropDownListID="ddlTest"runat="server"AutoPostBack="true"><asp:ListItem>1</asp:ListItem><asp:ListItem>2</asp:ListItem><asp:ListItem>3</asp:ListItem></asp:DropDownList></form>
复制代码


天生的页面源码是如许的

  1. <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>0
复制代码


次要是这个办法,仔细读读是否是和我们方才写的相似呢,人祖传了两个埋没域,一个用来是Target,一个用来及参数
  1. <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>1
复制代码

  1. <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>2
复制代码


未完待续,与君共勉

经由过程下面例子剖析能够看得出来,JavaScript基本没有挪用背景函数,只是提交了含有预设参数的表单,服务器依据参数挪用背景办法,天生特定HTML,所谓前台挪用背景也就这么回事儿。
有一个成绩值得思索,为何这类很想固然的做法PHP程序员能够轻松想到,良多.NET低级程序员却不可,乃至偶然候我们都已在利用了,好比依据Url的QueryString来挪用分歧办法,或举行分歧处置,却没有进一步想到更经常使用的Button、DropDownList是怎样做到的?仍是那句话,.NET程序员当自勉,不要被.NET的易用性惯坏,多进修道理常识,不要太过满意于做出来,而要多寻求为何,如许才干不休前进。
C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。
老尸 该用户已被删除
沙发
发表于 2015-1-20 18:59:39 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-29 15:03:59 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
再见西城 该用户已被删除
地板
发表于 2015-1-30 17:38:10 | 只看该作者
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
乐观 该用户已被删除
5#
发表于 2015-2-2 16:34:38 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
谁可相欹 该用户已被删除
6#
发表于 2015-2-5 21:45:40 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
蒙在股里 该用户已被删除
7#
发表于 2015-2-13 15:48:51 | 只看该作者
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
莫相离 该用户已被删除
8#
发表于 2015-2-18 19:33:44 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
只想知道 该用户已被删除
9#
发表于 2015-3-6 09:17:17 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
柔情似水 该用户已被删除
10#
发表于 2015-3-7 11:30:20 | 只看该作者
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
变相怪杰 该用户已被删除
11#
发表于 2015-3-16 05:00:40 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
愤怒的大鸟 该用户已被删除
12#
发表于 2015-3-22 20:10:38 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 05:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表