|
|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
|
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 1 B C* A0 t! D- U
) _% g" @, f2 t+ O; q; H& a) F/ O
1 ^" d4 [5 ?6 s" _
! N4 s3 x: m, H% r8 b( G8 x 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 & L% o2 H9 L" N' N8 \- u* c
带来的不便。
( f# F5 W9 x! U3 N2 p2 P B0 Z% |! v$ W# p% Z$ n
比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。
# |& e7 N5 U6 B# V! {* u+ i* ` , o+ g$ {9 R8 Q- e; Z
@! J* x* G" A3 t, b! u
, [$ m- T9 E# G7 v* y 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是
! T& i1 r \5 S" ^ 一段客户端的脚本,传入的参数就是这个控件的ID。
5 h& a+ c# |) A ScriptHelper类代码: 0 s9 f3 a! U+ Q% ^
/// <summary>
0 C- ?$ l z" ~# z( b: A* g /// 提供一些产生页面脚本的方法
) r G( f# f5 B$ |! p, p) } /// </summary> " t8 Q( h$ _2 \$ t) |
public class ScriptHelper
1 c: @# X2 X. _ T- r { $ J: k$ z2 I% q- K% J! a
) [( ]9 ?+ W) y6 j ?" `% I
/// <summary> @/ ]2 V c: d8 k) K4 E B
/// 获取客户端查看控件的脚本 4 P" g8 g$ g* A2 f
/// </summary>
5 @- o- Y$ I0 F6 T2 R% J; q /// <param name="controlName"></param> 3 D; V* r: ^& c: G' X* N$ R
/// <returns>脚本代码</returns> : k+ z' W# ?2 o# e/ H6 q
public static string GetViewControlScript(string controlName) 5 a( `* t! p# h3 V/ r
{
) B1 s1 s- y1 p9 Q2 R
6 }0 K" B0 o1 `+ d/ y //创建客户端函数ViewObj
5 p* O; m, ~$ F; B string script = "\n"; 4 h t" C' q% o( |( W
script += "<script language=\"javascript\">\n"; ' D2 V* `$ H0 X$ L) h. P
script += "function ViewObj(objName)\n"; % y8 s9 M" ?/ N5 C" b
script += "{\n";
: h) s4 v0 p: ]. y$ F1 u script += "var obj = document.all.item(objName);\n";
( D. T6 [6 ~4 X( F/ K script += "if (obj != null)\n"; 1 C" U$ ~3 t w6 }
script += "{\n";
7 i6 a8 g& r0 i( \ script += "\tobj.scrollIntoView();\n";
+ ~7 j% d6 L+ \! E script += "\tobj.focus();\n";
6 ?! C$ f4 }' ]) B0 y3 {1 F script += "}\n";
Z( y( y1 S& x) _ script += "}\n";
' O* b5 p" y; y& B6 G* C$ Q . t, H3 F) w; l. L
//创建客户端函数ToDo ! k, K; q7 T' I. f. L6 V
script += "function ToDo()";
t, l' l3 C. v, a2 s script += "{\n"; 8 f( j% \5 u- P0 s6 m1 ~: P, s+ w
script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); - X* l w8 x6 a6 ^1 M
script += "}\n"; , `; p. n4 o& v& j# Y' o* h
4 a* u: K! d; \3 K9 q0 L3 u% L script += "window.onload = ToDo;\n"; % ?6 E/ V% n0 i2 z
script += "</script>\n"; 3 ]( V+ {" s4 ?( n
+ x0 m+ s: X0 L& N6 u4 B
return script; / ^. ~. ~& N9 ]. X" s; ^& X: \# I
} y6 Q% X8 w0 L7 l' C
; q" J' x- W: i# {7 B$ m! ?8 s* s }
4 {. Q" e! [" n8 B 8 i3 u! m4 Y7 F* d8 n5 ]" X& e
使用示例:
# R( D- f) w) F2 s$ t5 |& { $ O7 c, M3 `8 e! B4 ] t8 n: K5 W
为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 5 S( @9 x6 u+ p- G
2 n% j# J1 C! H ] 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: : u, r( V" ?/ u' A/ c7 K9 V1 k8 ~# j1 a
private void btnSave_Click(object sender, System.EventArgs e) ' Y7 L1 |8 W, T/ E+ k# E, M; E( V
{ 4 Q0 ~6 _! a5 g( ^$ q2 n/ f- F
project.UpdateProjectInfo(ds);
% }& j# ^$ j9 ]+ p2 X lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 4 O" S# I% S3 K0 u' ]5 a+ p& D
}
1 H% z f, [ @6 [* H; L" ~ ! f! f+ u- ]5 c% c( e
在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。
; o4 x+ z1 i5 ^# m:+
3 F6 r' x: D( i8 H4 E+ F# [或者:
& s% {' W3 p: f4 L; x1 I/ T- S% ` R/ g1 F3 U
在page_load()中增加判断 * M \ s! N6 s3 u9 K6 f8 x
if(!Page.IsPoastBack)
5 A" |" c, x, z$ Q* B8 w+ b { 0 ?, a) f6 e4 w% g6 A
//初始化页面内容;
o) L6 a+ ~7 t) @# M. w } |
|