|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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
我们在看良多网页的时分城市看到如许的内容
- <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挪用背景办法了,起首筹办如许一个页面
- <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>
复制代码 在背景增加想挪用的办法
- protectedvoidtest_Click(objectsender,EventArgse){Response.Write("ButtonClick!");}
复制代码 很复杂的内容,背景办法的两个参数完整能够不必(和事务有关),填上只是为了增添其传神性,代码中有几个必要注重的中央
1.form的办法必要设为post,这个很分明。。。
2.form的action设为页面自己,也就是让页面提交给本人
3.input要有name
筹办事情做好后就能够摹拟JavaScript挪用背景办法了,在页面的OnLoad办法中写进代码
- 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是如许的
- <formid="form1"runat="server"></form>
复制代码 人家主动就给render成如许了
我们也不必要本人在OnLoad中增加if-else,只需在control的属性中增加OnClick=”XXX”就能够了,我没看过.NET源码,可是我勇敢的忖度,固然不必再OnLoad里if-else了,但应当也是相似的体例处置。
不主动提交表单的怎样办
仔细的同砚大概要问了,你这么做是能够,可是依附于表单提交,我们晓得并非一切的页面元素城市点一下就提交表单,像控件asp:DropDownList的OnSelectIndexChanged事务,人家也会挪用回台办法,那是怎样做的?
实在十分复杂,关于这类需求,仍旧能够用表单提交的体例处置,不克不及主动提交表单,那末我们能够用JavaScript匡助其提交,看个selectchange“挪用”背景函数的例子,起首像如许修正页面,增加一个select
- <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触发了,然后挪用预界说办法,背景代码是如许的
- 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,还记上事务范例,相似如许
- 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的代码和本人写的客户真个就能够同时存在了,如许
- 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
- <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>
复制代码
天生的页面源码是如许的
- <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>0
复制代码
次要是这个办法,仔细读读是否是和我们方才写的相似呢,人祖传了两个埋没域,一个用来是Target,一个用来及参数
- <formid="form1"method="post"action="Default.aspx"><inputtype="submit"name="test"value="test"/></form>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关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。 |
|