|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! * @- b$ ?" n+ G
2 a: Z; X4 l/ T, f! K
7 Y: X' p2 |% v1 I
3 r+ u. E: y2 O/ U# T2 J" G5 i 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新
2 k3 \ L3 C2 Q4 M 带来的不便。
$ G, B- n. D% K3 f& [
- X1 m8 ^: `1 e- i' R% ^. [" V4 j 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 \+ x1 [# B) T8 I- p
& ?0 l; w8 j8 ^* A# E4 U' F
) i P; \0 b: V& q# R
1 n7 C( l1 q. \+ d6 H v) a8 T 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是
) O, ?/ j* A" ~# C 一段客户端的脚本,传入的参数就是这个控件的ID。
5 W3 L2 @% i, e! }; o6 d' R$ R, X ScriptHelper类代码: 8 `+ B$ H. W0 ]3 Z' @! q |
/// <summary>
; W* W3 g- o& G$ C' a ?. d /// 提供一些产生页面脚本的方法 3 i! {2 W% q+ C8 Q, j3 A
/// </summary>
" @5 A; X+ e- w# V& {* ~ public class ScriptHelper " K; I& y3 E" l4 x U4 i4 M5 E
{
5 j( P3 O1 ?( W3 ?) ?8 r
& \7 x$ q8 F" w, \2 M0 b /// <summary>
: ^+ @7 A. r/ M8 O7 `2 T; @/ ` /// 获取客户端查看控件的脚本
9 R1 p, H- m: P. F/ j& d /// </summary>
9 H7 V- r3 H/ M' n0 Y& A# t0 x( f4 Z /// <param name="controlName"></param> ! O% ^+ T% D; C& r M7 _+ N
/// <returns>脚本代码</returns>
5 z8 l- T2 ~! `2 d* @7 ]3 E9 `3 p* d public static string GetViewControlScript(string controlName) 3 h2 G ?9 b. I( y$ E
{
: Y4 x: E1 J& i4 @1 z
, `5 v0 d- C( ~, \ //创建客户端函数ViewObj / l; N5 ]- I, ?
string script = "\n";
% c' ]: [; [* `, _( s script += "<script language=\"javascript\">\n";
) Y7 }0 m/ x4 q5 I) l script += "function ViewObj(objName)\n";
# @: E! P# U3 A script += "{\n"; $ L& e% n8 z! M/ ]& O4 _3 y
script += "var obj = document.all.item(objName);\n"; # s4 H) D. o& F9 R" ^$ U/ B
script += "if (obj != null)\n"; 1 Z1 X; t/ f6 ~( F
script += "{\n";
* i% G' G' R. j script += "\tobj.scrollIntoView();\n"; $ l" t* W- ~: f3 K$ {
script += "\tobj.focus();\n"; ( g" F. Q0 g5 V; q) u$ o; R
script += "}\n"; , B! C+ P2 S% Y, E( S! ~
script += "}\n"; . r3 A% ?; q# d( @/ e
2 I2 I" B* i6 H# F* r4 ^! f //创建客户端函数ToDo
. W. v/ r$ H [2 B& \( f# \ script += "function ToDo()"; ( z8 K2 `# ^$ ?/ T; g. ^5 f
script += "{\n";
: n. }5 b! Z: Y6 \ script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); + q- Q3 N, b- b5 C# U
script += "}\n"; $ P5 }& [% A! o. @( i# {+ ^" T" w5 F
2 [0 B8 ?, S. G/ ?* M* o; Q
script += "window.onload = ToDo;\n";
3 V- {1 @1 J+ e& d script += "</script>\n"; * d6 T$ ~5 |; |+ F
) V& q4 H; D4 q$ x return script;
# R( v& G2 K/ B: s% _/ | } 3 E! B& w0 n* e1 a y
% a* a1 h: w b! T G! ^ }
s: v# m8 I' u2 g5 X; M& n + p8 a' u& ~4 Q& F. Q
使用示例: : v7 ?9 Q/ o0 j! S. u( |
0 a. f, ~8 f3 _% X
为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 ; Q( o; X+ \6 [3 O
! H: b2 t7 t$ ~' O% [ p
然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示:
! v; t' s1 }6 ]5 Q/ _" W7 K& j private void btnSave_Click(object sender, System.EventArgs e)
9 V6 q1 O; W/ Z! w! D7 r( _' @ {
+ Z( t _3 j1 }0 N+ ` project.UpdateProjectInfo(ds);
( _1 e$ O, r$ W: v$ v" \' P0 r; \ lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); $ Z( F- }% u" w, g( g6 S+ {( {: V2 K
} + t( Q; O F) ]1 C8 s# t
* O& i0 {, c( |5 G- Z" o- [ 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。
6 t) S2 \8 L1 X4 h:+
# D' E) P) t3 t$ O6 f, `9 ^8 R" O或者:
6 ~" u. m1 ]' C- s, M" ~
6 k# c) [; c0 V在page_load()中增加判断
7 j; T7 Q! [' l% j/ s G if(!Page.IsPoastBack) . u6 J+ f W: F" @' }! c
{
. n* H# Q- r# @& T& T) a8 @( O //初始化页面内容;
' y5 C) V3 O1 w% m( M* n4 H } |
|