|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧!
3 [. o, H0 n" ^1 [6 J " X$ \) d4 G( v8 V( ^1 j
4 i) J6 \- j; Z9 h& v2 S
0 }0 S; E$ O/ s
我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新
0 _7 f/ g4 T* T4 @: j& C1 C/ Q 带来的不便。 ' z+ L$ ^# {. v
/ B; l1 j. I/ _4 R+ A 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 , X. [+ h) a% W. j
" m$ i2 T% b5 T0 A# s7 Z1 X
/ i0 t6 `3 o4 m; R0 ^. Z 0 z, g/ s* R3 C$ o+ J* i1 p6 z C0 ]
写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 : q$ E+ A" ^' K1 \; Z# Z
一段客户端的脚本,传入的参数就是这个控件的ID。
1 G* {# ^$ H* J ScriptHelper类代码: $ A- }& U$ q. A5 ^3 o; l2 t" k9 e' V
/// <summary>
; y9 a- X! y1 h /// 提供一些产生页面脚本的方法 ' ?) @2 z5 R( H" h
/// </summary> 3 v! R2 N$ o9 v0 M
public class ScriptHelper
7 }$ N# B$ B- ]' }4 _' o+ G { 5 f: l- g& j0 H, I
/ X9 |0 s2 ^- S! V /// <summary> ' o: n8 A3 F4 v, t5 z$ O3 ~" m
/// 获取客户端查看控件的脚本 ( |# ^2 B9 A; l/ P
/// </summary>
4 g3 q2 ~+ m7 h /// <param name="controlName"></param> # m! Q0 I( ]: H" V
/// <returns>脚本代码</returns>
2 |* }' u% ]+ M+ |0 J+ g* \ public static string GetViewControlScript(string controlName) 0 x% q$ i$ f( X- E5 q' @4 o( n
{ ! R6 I% u- [9 F8 N Z
# A1 K9 O9 h* U5 n. M //创建客户端函数ViewObj
& y( f# D. p: O7 Q8 n string script = "\n";
" E0 L5 Q: Y+ J4 Z script += "<script language=\"javascript\">\n";
) w2 e2 V4 D8 X, A S( q script += "function ViewObj(objName)\n"; 0 B! K, k% |1 j; z2 N$ C
script += "{\n";
: I% I& F5 R9 o/ \7 I% y script += "var obj = document.all.item(objName);\n"; : G4 t' F+ @! M( d* \6 C
script += "if (obj != null)\n";
" d6 {! b* o2 i z/ d9 _ script += "{\n"; : L# c0 ?5 X; n/ w, w* K
script += "\tobj.scrollIntoView();\n"; 0 F: C( Z, s6 e% i+ x) X
script += "\tobj.focus();\n";
8 R- E& A8 p8 @9 Z6 z# s# K script += "}\n";
) e# ]& w, J- \4 }! g' M script += "}\n"; - G, j/ s3 y6 g. v! `# U4 S
X1 C1 m) B, F' w' Q# w( a" Y //创建客户端函数ToDo
3 J9 h" B A) } script += "function ToDo()"; . \+ [" `4 }. P$ K& U K0 c: O
script += "{\n";
* P; Q; l/ ~: p script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); 4 j" j( K f$ p6 x
script += "}\n";
3 S5 C- ^* v. [( f+ e+ [
! R2 I: t& r* g* N0 e- }; Z script += "window.onload = ToDo;\n";
( A5 m4 ~8 ]4 f' {: @% A4 B/ U script += "</script>\n";
. n) ^6 U |1 ~, C
+ o5 I) L9 A5 l4 {4 s O o0 b3 z return script; 3 Z) S$ [8 ?( W6 n, D; P3 n
} 3 ]. o7 q( |0 e$ F
) {8 o) U! P) R }
7 ]4 E- a* w: E: `6 O+ J ! o- p( B* q+ m8 ^) S* ?
使用示例: 6 |! D6 ]# m0 }- _% p w
4 C+ w, w9 X, E& Y! V( n 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 , c ?6 @2 o2 I; @5 r
5 ]3 l8 c# W; L 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: " ?, z+ `* l( k$ o& q0 W; d$ o; _
private void btnSave_Click(object sender, System.EventArgs e) 7 C' ~$ N2 ]5 [# r6 g8 e
{
4 s# A) m- k) M& k% i project.UpdateProjectInfo(ds); - p& N8 g$ w$ L! J1 p3 [6 v% T
lblScript.Text = ScriptHelper.GetViewControlScript("btnSave");
& L" a; \% x1 t# _) `! V. T" c } * Z7 `3 \" p" x/ u& [9 i9 v6 O
$ u, R( A) I7 }& l0 ?! w! K8 m" { A
在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。
3 w8 L+ F u4 x9 I:+ 0 ^8 B) P/ c0 I! R( N& P& u! q: m
或者:% H: P) M) P6 ]$ I6 _
$ c$ @( H! y' o0 M# b' O在page_load()中增加判断 , W/ G: z8 i* B6 T
if(!Page.IsPoastBack) ) J- o# Z. X( P G+ I/ }
{
& t9 C. Z$ _. {' L2 a1 _ //初始化页面内容; $ I% O* E$ f4 b, X
} |
|