|
楼主 |
发表于 2008-1-9 10:14:00
|
显示全部楼层
回复:网页防刷新重复提交、防后退解决方法
用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧!
" X7 R. @) l0 k0 p
# g. \5 O8 s, b 4 ^1 g, p h; r. [
( H2 D, C% e4 ?) S 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新
/ t1 z2 x+ G) D3 J7 G: H 带来的不便。
6 }: w# d j$ T: v- ?; R
, O3 F* I; H S& }. p 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 # s% o4 g3 l: Q8 y* ^: o; k! Z4 h
, R1 j: G( y6 g; S3 H2 u% g 4 w' C9 y( ^5 F
( |3 T! c7 M" U, t$ }* c
写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 8 `! l! f$ z, }
一段客户端的脚本,传入的参数就是这个控件的ID。
7 u8 ^3 x- l7 Q$ c ScriptHelper类代码:
* R' Q4 z0 G+ Z! I /// <summary> " n% q. s& |6 m5 Z1 N" e' N
/// 提供一些产生页面脚本的方法 % c6 C, u$ n6 y4 u8 Y
/// </summary> 4 L2 F* [- X/ }- F
public class ScriptHelper
3 c9 w9 J) `; q1 m# g F {
6 S$ W0 m- C1 @' C. H2 g6 t8 N
8 M7 @5 o: Q4 K7 I9 `% \* C /// <summary>
6 S8 a( d' N7 _8 I /// 获取客户端查看控件的脚本 - u8 j* w# t: d" V h
/// </summary> ' n: L; F3 b* k9 K" G( }8 P4 @
/// <param name="controlName"></param> . t! |* h7 l" u) N) C+ z5 {
/// <returns>脚本代码</returns> + @' z) B. \$ w
public static string GetViewControlScript(string controlName)
1 K+ Q7 e; a% y9 q6 b/ G { 1 t# H9 f! j; _8 d# L3 q' l7 S8 Y
3 W, K( {/ w6 k& y/ r. x/ D4 ^
//创建客户端函数ViewObj ( I: Z+ i$ `5 K
string script = "\n";
% ?* H4 e# K" T4 X5 c5 @ script += "<script language=\"javascript\">\n";
( L! t! t" m# J% H/ p4 j9 I3 l. g script += "function ViewObj(objName)\n"; 6 O/ p3 ~7 Y0 k u+ O5 w
script += "{\n";
, p6 v k! B2 B0 d. C script += "var obj = document.all.item(objName);\n"; * F9 u7 f; v% k- L/ H5 T1 t
script += "if (obj != null)\n"; * t: Z- u0 z9 h* s
script += "{\n"; : e7 y+ @1 U1 b3 @
script += "\tobj.scrollIntoView();\n"; 4 g# i$ H& ?) F5 b% k N
script += "\tobj.focus();\n"; ' \5 T/ F. u. ?" @6 |' e1 ^& s
script += "}\n"; + I; Q0 W% W% W% l& S) k
script += "}\n"; ; P6 J4 O* Z. g& P- x* p$ v
7 t( _/ a3 J0 }" V& Q //创建客户端函数ToDo
& b0 Q2 \0 @; R' B script += "function ToDo()"; + l2 j$ C* \1 H6 ^ J0 G
script += "{\n";
. O& y8 [5 i2 z5 U7 M script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName);
1 h( V* b1 ]- I script += "}\n"; . k" q5 \( V/ W8 ]0 d
; ^7 I' l1 e9 L% l& G script += "window.onload = ToDo;\n";
$ ?) V; x% @& T" {4 C4 i0 i script += "</script>\n"; 7 j5 P3 y" V, `, I2 A
0 ~7 _" n* B- C" P return script; : l- {4 V; s- _- o9 Z
}
) f& z0 u$ }$ l. r : c0 y; [ F/ {) U/ b2 i: w) _
}
. t+ ?" C6 c/ r% [ d+ ?
. j1 l: n7 Y: z* f5 b$ ` E 使用示例: & q) A- w" n8 A V) Z/ Z( U& N
8 D) F* S; G1 b6 n; h! y' q: M
为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。
) |1 O5 {9 w5 s2 ^$ U- {7 T ' Q/ N+ X8 n M; U
然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示:
' {9 Q% g. l! ]3 _6 L private void btnSave_Click(object sender, System.EventArgs e) / l* D, I* u' _0 Q7 s+ ?( }
{ , \! j. o$ ~5 m& P
project.UpdateProjectInfo(ds); + _4 G' C/ `, q
lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 4 o* {( U3 ]. W3 W! D1 N! V, r0 ~
}
* r3 p4 @% X* A0 K8 g, ?
' h$ n) Z% Z: r4 J/ l+ d& T 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 % {& J ~: t* x6 z) U
:+ . i" W- J9 w+ x8 G
或者:
, f1 D8 w3 Y! G/ A/ v: A) T% j' Z" |2 D! o( h; s
在page_load()中增加判断
l1 X( h5 Z+ C6 Z C7 J) ^& w3 f/ Q if(!Page.IsPoastBack) / j% b: j& S0 |4 _( P% q
{
* J6 @' K5 p! I/ P1 U //初始化页面内容; $ [: K" t- T7 t7 y* P( U' `
} |
|