小女巫 发表于 2015-1-16 22:23:01

ASP.NET教程之ASP.NET 怎样制止页面从头收拾时反复送...

什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)有些利用者的举动真是使人猜不透…,开网页有事没事就来给你Refresh一下,这个举措看似有害,可是在刚实行过Submit的情形下,Refresh网页会形成反复实行,这也是为何在各年夜购物网站的买卖付款举措,城市提醒「不要封闭网页或从头收拾制止形成买卖失利或反复买卖」这一类的讯息,但依据履历,就算在网页上提出告诫了,仍无为数很多的利用者仍然会Refresh网页。注重,别觉得只要ASP.NET才有这类成绩,这成绩广泛存在于网页程式,不论你用何种平台、言语开辟,这肇因于扫瞄器会自行Cache利用者的扫瞄举动(包括材料),测试过IE、FireFox、Chrome都一样,料想是由于如许才干有上一页、下一页的v程记录,至于更进一步的切磋,小的力不从心就不再穷究(接待t解的先辈高人指导一下迷津,说说启事)…既然扫瞄器塬始计划云云,而我们大概永久都猜不透利用者爱怎样操纵,那就针对ASP.NET的开辟来看看有什么体例能够办理如许的成绩。
不晓得有无人跟我一样,即刻想到的是:从头导向,也就是在实行某一事情乐成以后,实行Response.Redirect办法重导到了局页面,这是最典范的作法,不外这对照合用在举措联贯的多重网页表单,比方:购物车,在完成结帐后就能够导到订购乐成的讯息页面,归正后面也从第一步、第二步…到结帐画面了,再多导一次已不同不年夜。惋惜多重网页表单究竟是多数,年夜部分网页程式如今几近都请求非同步更新(AJAX),最幸亏统一画面完成一切举措,即使明天不请求非同步更新,每一个功课完成以后都导到另外一个网页,也不甚幻想,以是这类作法其实不完善,除多保护一个网页的贫苦不说,现实上利用者若先回到上一页再从头收拾,一样大概会形成反复实行…。
那在任何异动前,先反省是不是有不异材料存在呢?换句话说是在材料库端反省,应当可行,不外…历程仿佛稍嫌烦琐,要针对每个功课内容一般往撰写比对是不是有不异材料的逻辑,光想就以为累了…,何况偶然候的确是能够同意不异材料存在,好比说线上客服的留言版,利用者不历久候时,会再留言一次,内容大概跟上次千篇一律,这跟重刷页面酿成的材料反复是不成等量齐观的,如许看来在材料库端扫除不异材料也不是很好的作法…
关头点在于怎样分辩出利用者正在重刷页面,进一步地,有无与日俱增的做法,让我们能够反省某一属性就可以判别是否是重刷页面所回传,来制止反复送出举措?转念一想:太阳底下无新事,上彀征采了一下,外洋有几篇文章、会商串针对这成绩提出了几个解法(现实证实前述两种作法也是有人倡议),个中我以为最值得一看的是底下两篇:


[*]BuildYourASP.NETPagesonaRicherBedrock
[*]PreventingDuplicateRecordInsertiononPageRefresh参考上列两篇文章的内容,失掉最初的谜底是:我们能够承继ASP.NET的Page种别,自行扩大所需的功效!作法以下:
1、承继System.Web.UI.Page,自订一个BasePage种别。
以下为援用的内容:
[*]usingSystem;
[*]
[*]///<summary>
[*]///BasePage的择要形貌
[*]///</summary>
[*]publicclassBasePage:System.Web.UI.Page
[*]{
[*]publicBasePage(){}
[*]}

2、在BasePage种别底下撰写SetActionStamp办法,目标是在Session寄存一个体系工夫戳记。
以下为援用的内容:

[*]///<summary>
[*]///O置戳
[*]///</summary>
[*]privatevoidSetActionStamp()
[*]{
[*]Session["actionStamp"]=Server.UrlEncode(DateTime.Now.ToString());
[*]}

3、处置PreRender事务,在网页初度载进时设置戳记,且每次载进实行时会把该戳记寄存到HiddenField里。
以下为援用的内容:

[*]publicBasePage(){this.PreRender+=newEventHandler(Page_PreRender);}
[*]
[*]voidPage_PreRender(objectsender,EventArgse)
[*]{
[*]if(!IsPostBack)
[*]{
[*]SetActionStamp();
[*]}
[*]
[*]ClientScript.RegisterHiddenField("actionStamp",Session["actionStamp"].ToString());
[*]}

4、自订IsRefresh属性,藉由判别HiddenField寄存的戳记是不是即是Sessione寄存的值,就能够得知网页是不是经过从头收拾举措回传。
以下为援用的内容:

[*]///<summary>
[*]///获得值,指出网页是不是经过从头收拾举措回传(PostBack)
[*]///</summary>
[*]protectedboolIsRefresh
[*]{
[*]get
[*]{
[*]ifHttpContext.Current.Request["actionStamp"]asstring==Session["actionStamp"]asstring)
[*]{
[*]SetActionStamp();
[*]returnfalse;
[*]}
[*]
[*]returntrue;
[*]}
[*]}

以后撰写网页程序时,只需衍生自BasePage就能够获得IsRefresh属性值,能够用来判别网页是不是被从头收拾,制止反复实行之前的举措:

至于观点是如许:网页初度载进时我们在Session纪录工夫戳记,Copy一份到HiddenField寄存起来,在页面反覆实行时该戳记一直是初度设置的值,直到某一项举措我们但愿能够分辨是不是经过从头收拾所送出,以是对IsRefresh属性加以判别,初度送出时固然会回传false,功课能够顺遂实行,连带只更新Sessione的工夫戳记,这时候已分歧HiddenFielde的值。风趣的事变来了,Refresh时把上次举措再送出一次,但由于扫瞄器会Cache形态,这时候HiddenFielde的工夫戳记仍然是较旧的值,分歧于Session所持有的,反省IsRefresh属性值是true,为了不反复实行就能够把举措挡上去。
今朝为止,本文就题目所提的成绩提出解法并复杂申明了观点,但后面所供应的那两篇参考文章实在有具体的论述,想懂得的人倡议必定要往看看,出格是第一篇由大家DinoEsposito(介B、人部落格)所写的文章。
最初说一个Dino大家的文章有提到的小技能,既然我们扩大了一个有侦测页面从头收拾功效的BasePage种别,那要怎样让以后新到场的WebForm预设都是由BasePage衍生而来?能够翻开web.config档e<system.web》底下的<pages》设定pageBaseType属性,比方:

设定完成以后,今后新到场的WebForm就会改承继自BasePage。

也不知道,我同学昨天说数据挖掘很好。

爱飞 发表于 2015-1-19 09:57:32

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

小妖女 发表于 2015-1-26 15:20:21

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

因胸联盟 发表于 2015-2-4 19:32:31

现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。

冷月葬花魂 发表于 2015-2-10 05:50:55

对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。

乐观 发表于 2015-2-28 22:26:11

目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.

精灵巫婆 发表于 2015-3-17 06:11:31

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。

若相依 发表于 2015-3-23 23:39:53

CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
页: [1]
查看完整版本: ASP.NET教程之ASP.NET 怎样制止页面从头收拾时反复送...