|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 4 t2 ?# [" ]) t- b+ T. y m& |9 B( t5 b
" [% B; K: B# V
5 | ^, I( u* { ! v7 J! ?, I3 t9 ?' o
我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新
3 C' D' N' Q' m& L; ~9 T 带来的不便。 ! v4 [! x& c+ |" U9 P
. X( G5 q+ O" C$ U1 T' ] 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。
4 w2 s+ P$ R$ x+ v5 o
9 {! c" i; R6 F1 n; q
8 i& H6 l. Q, N% ~9 W - y/ J. G' `; ?3 v9 e) T( Q; g
写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 . k% W3 `- x" j2 r( a$ W8 d
一段客户端的脚本,传入的参数就是这个控件的ID。
. L0 z/ s3 b+ H; P8 a ScriptHelper类代码: $ R: Q, t( v3 P7 y
/// <summary>
! H! H$ c8 ^8 Q$ o' `" |( K5 T /// 提供一些产生页面脚本的方法 Z9 T+ V) m9 `& {6 T' V
/// </summary>
8 {4 W, Z# f' O' y9 Y. i1 s public class ScriptHelper
# s: i6 l& d. s( W( ^! v* Z2 `; H { 3 z6 t8 g7 M# \ t7 r7 G
8 e$ r& n } A" B- A' H, S /// <summary>
) V7 B7 h: V6 \* E) U6 @ /// 获取客户端查看控件的脚本 - {5 `4 P) x3 w6 z7 w& X+ `7 t% G0 A
/// </summary>
1 R. c8 a( j$ u: [3 P4 ^ /// <param name="controlName"></param>
: d1 z. @+ J9 U; @) g( A% r /// <returns>脚本代码</returns>
$ k3 y, d) ~. i/ R* k public static string GetViewControlScript(string controlName) : Y- ~; }% l! {) k7 i+ ~& L5 P( Z
{ 1 S. ?7 E6 |6 ^% y6 N8 P6 N
+ [2 N0 Q6 I+ _
//创建客户端函数ViewObj + M7 `% P- @3 Q/ v j6 q
string script = "\n"; , |, F- x7 T1 x2 {0 n
script += "<script language=\"javascript\">\n";
9 ~" X) E- S- J# \& } script += "function ViewObj(objName)\n"; - q K8 s r- K: n. |# i
script += "{\n"; 9 F5 [& \8 g9 O. t
script += "var obj = document.all.item(objName);\n";
0 ?; N" I5 d! ?9 q' s* s6 | script += "if (obj != null)\n";
' ]0 T. O# q+ p* Z script += "{\n";
) m4 h* e _/ \ script += "\tobj.scrollIntoView();\n"; 1 z4 a# O& N, {) K" E2 k8 `8 l: ~6 E. a
script += "\tobj.focus();\n";
, h: P/ Z# Y+ e. a1 B, m script += "}\n";
* l; `$ I. `/ g. Y) {1 ~ script += "}\n"; 1 D6 J5 w" o7 ^
( Y1 e6 r9 I* m% ?# }& u
//创建客户端函数ToDo
: p' T9 _4 O5 v" a, v" d script += "function ToDo()";
+ M) K# R: E+ w& Q' ]9 i2 g% O script += "{\n"; % K+ D* L4 O }' G
script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); # I8 d& |8 w; K4 Y6 t$ a
script += "}\n";
* K# f" L) K1 @* H& E% F: Y; W 7 r% ] x* Q# y' h& N& I0 X7 C
script += "window.onload = ToDo;\n";
# T0 C. n2 C4 A) \+ F: n+ o4 T script += "</script>\n";
- [* Y2 v9 { u' {* C7 s. y1 m: J / ~- g% l6 m: U, B
return script;
, }( f# G5 C4 O1 \' q } 3 o3 ~6 E6 [ N, L% }
% |/ H( F: b4 n7 @) k; | } . `0 g* C6 y4 `/ t' c5 }
2 |' F3 Q0 H$ F8 {" |: E 使用示例: 1 J* P6 ]$ P5 y0 `) Q7 R( d X
3 T' E% C; |7 w& P8 ?, q! M
为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。
; m8 U, `- u! F! H, i, \" P
/ Y8 V2 S$ h( G$ B* q 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: ! o7 d; T% S; `& ~* h! Z; k7 J4 G3 b
private void btnSave_Click(object sender, System.EventArgs e)
" p8 \: o! j0 O# X, G {
" I' ]" Y$ ?1 f project.UpdateProjectInfo(ds); & Z( v! ~# i. f+ @! G4 `# K
lblScript.Text = ScriptHelper.GetViewControlScript("btnSave");
# t# n" h' _9 S1 m/ q7 I4 u3 U ]8 u5 s }
" T( _. p) P" z G4 m+ j2 x 9 f7 y0 g( V5 c, |, [( ]
在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 ; ]& p( E$ O2 j4 ]8 W! j/ c3 @
:+
' w2 Z' M7 a6 Z. {) t5 Z$ H或者:
2 x8 B4 Q* D V4 w# T
' a! V/ A) G7 p" b4 I8 d; v在page_load()中增加判断 ]5 ]) Y$ S, T. v; |; B
if(!Page.IsPoastBack)
; i( {1 m% p) S0 I# o6 k5 J" Y" \ {
; b1 @, _4 O- J: v+ Q //初始化页面内容; ( ^- r4 o' a# b( [9 q: V
} |
|