|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)有些利用者的举动真是使人猜不透…,开网页有事没事就来给你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。
也不知道,我同学昨天说数据挖掘很好。 |
|