|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! * \* S7 d9 Q" }7 g! W! a2 k
, ^6 [/ V- g- e5 i! e7 a- ^
0 p& F! G6 D* N4 i6 `$ l3 |
7 O8 D, s9 s$ v 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 ! \! v* {+ m0 e. r/ I
带来的不便。
2 R) S9 ]5 U7 p3 d: c! _. K
3 w! y( A: o# s" m 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 5 X: ?. q$ u/ h' s7 M" @6 x4 Y2 Q
0 i" c0 G6 a% R# p$ |
- f- b% v% }+ t! q8 b 7 z9 E2 L( n2 }9 }
写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 + ~( j. {0 b: P+ {" V( K
一段客户端的脚本,传入的参数就是这个控件的ID。 $ A1 O+ i" G) p9 v+ G* d) G# B
ScriptHelper类代码:
% |. t. F5 |3 y- a, @8 S /// <summary>
9 g) v) D; {9 l/ S- m% Y /// 提供一些产生页面脚本的方法 7 Q$ Z8 E' \4 B9 g8 K, Q8 }0 R
/// </summary>
9 D: o- I( n! v public class ScriptHelper ; t7 }1 s# ^4 u5 [
{ ) ?" [. ~1 s$ @2 l- G0 C
P' b5 G& z8 F /// <summary> 2 @# P* [, r' W( K. M) v2 Z7 N
/// 获取客户端查看控件的脚本
7 N4 i- b& i, g6 d+ E: M+ b /// </summary>
5 B% ^3 ~$ D5 I /// <param name="controlName"></param> . x {% S' C: K' ]7 N. `. a/ `1 v
/// <returns>脚本代码</returns> ( [3 R3 T; _, v# c% B+ O+ U. F
public static string GetViewControlScript(string controlName) 9 {# p( |3 ^0 j6 y/ h, ?
{
4 W9 V* J* w3 i% Z: _1 m% c7 u
& M' n! n9 s* c) p //创建客户端函数ViewObj 3 A; G. G& ?: O- _/ B
string script = "\n";
- Y) c8 l8 X0 | f script += "<script language=\"javascript\">\n"; ; g; n$ k8 {& @! Y$ b
script += "function ViewObj(objName)\n";
4 d9 [$ ^ w) b' T% ^ script += "{\n";
2 q% Y& K, o/ P; w! e! G" n, q script += "var obj = document.all.item(objName);\n";
6 I% b* M) B+ A4 g; Q& B script += "if (obj != null)\n";
: t2 b. C3 k4 K6 k script += "{\n";
9 C! Z! u& E7 G& l, T- M script += "\tobj.scrollIntoView();\n"; ' v) f/ d9 p* u: Z0 U# O; I7 q$ g$ x
script += "\tobj.focus();\n"; ( _! C! J0 O. T( c% N- g
script += "}\n"; . x H9 _# u7 \1 b# w/ p
script += "}\n";
1 b) B/ p5 o6 P( {( x. }: R
5 |+ ?0 V2 s9 I //创建客户端函数ToDo , S4 H6 M6 u: z0 g6 B' ]! {- p
script += "function ToDo()";
; q0 H. Q# Y3 A! s0 R; g: V' V script += "{\n";
; y" r4 y* d7 _. H script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); ( Z) _' w$ g# t' T. a/ i
script += "}\n"; ! ^, z) G# y: U; W U0 Q4 D
- d& S1 h0 Z7 d2 _9 y
script += "window.onload = ToDo;\n"; - `, f# l1 W0 b& q! x
script += "</script>\n"; 2 p9 x R& j% V: D Z& j2 ^; n* b: U, l
8 E; g& f4 T1 z0 S& Q return script; 2 B0 s* J! c0 N+ ~4 B1 @, Q
} ; o, s) V+ M: h4 D0 s; q
/ E3 n9 v; X8 R% \5 Q i1 @5 ~ } 9 y* y' k: N3 s5 ?( v* V/ |3 p
8 U5 o: p- h3 \- a. z0 p: ~
使用示例: 5 B5 i( S8 h; g5 v1 |9 q* ^
% M# ~4 \+ q* F, u0 W* F) { 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。
) ]3 u8 H0 Z9 P/ a , c; \% \/ P) _6 C/ F, W. j
然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示:
% r9 `5 h- s5 w1 @ private void btnSave_Click(object sender, System.EventArgs e) 2 D: x0 i' M% C
{
1 U* E, _4 n& k7 R' d/ B% H" t) v project.UpdateProjectInfo(ds); 3 B! y+ R! J0 P) e
lblScript.Text = ScriptHelper.GetViewControlScript("btnSave");
7 P: f1 W0 T/ P$ d }
1 S' G$ o7 g; f$ c$ t1 }2 d
/ c5 }2 i+ y9 i" e1 n 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 I" a7 h' y7 A F
:+ 5 k4 b. k; X* B4 @+ m) p- k
或者:
1 X, e Z6 h G+ ?7 G+ @# f
F/ h' [. p$ T: f+ W0 u在page_load()中增加判断
' f. C$ _5 T9 i# v, c1 _( L c3 S4 N if(!Page.IsPoastBack)
2 K* r6 y8 T! O3 f( j8 w6 s { ) Z: l5 j8 C2 u4 u9 f/ o. p9 r
//初始化页面内容; * y+ X* b; Z! Z, U6 [
} |
|