晨鸟科技

标题: 【体验式实践系统】上传文件大小限制、捕获大小限制异常 [打印本页]

作者: Star    时间: 2010-12-16 18:44
标题: 【体验式实践系统】上传文件大小限制、捕获大小限制异常
本帖最后由 Star 于 2010-12-16 19:53 编辑 - N/ A, H( o; @3 N' k7 c
6 Q, q/ w6 w0 W5 }+ T
具体办法是参照的这里:http://dotnet.aspx.cc/article/d8 ... 7027662e/print.aspx
" A. c* \' S6 O/ B) N添加了Application_BeginRequest函数,还记得
  1. <%@ Import Namespace="System.Web.Configuration" %>
复制代码
,把web.config的内容Import 过来
% [. [( I1 H' I  N; F
/ x' u- r& P9 `; h; \/ M, R6 y6 N: ]方法是正确的,而且比较好
7 x. [- ]1 J& }: a* x8 D只是EB_EXP有个问题就是在进入实践页面的时候,pr_id,ex_id,com_id都是从left树里面传递过去的,使用上面的将诶办法,当出现异常的时候会需要从asax重定向到出现异常的页面,如果不加处理就直接定向到异常页面,在页面加载的时候会重新绑定数据,这是需要重新将pr_id,ex_id,com_id这些参数传递过去,asax页面是读不到Querystring,应该是Request的内容已经修改了,之前的地址参数已经没有了。
4 H% J; k- S1 s. Z5 X8 }0 W, V/ Y于是在PracticePageBase页面在读LoadQuerystring函数中,在读地址参数的同时将其保存到Cookie中,Cookie信息是可以在有效时间内保存的;
  1. public virtual void LoadQueryString()& F9 T/ C/ m' V1 S5 y1 D
  2.     {
    8 A0 D# P9 f3 U* l. {% a
  3.         /*如果上传的文件超过web.config中限定的最大值,使用asax来进行异常捕获时,会需要重定向请求url,
    + j4 I! Q4 _6 C$ E. Z
  4.             所以需要将ex_id、cm_id、pr_id信息放到cookie中进行保存,在asax进行页面重定向的时候再将这些值作为地址参数传递过来- b* ^$ i. c7 `# f( D; r7 I; H
  5.             否则页面重定向没有再传入实践ID等参数,页面会加载不了数据*/# |+ n: c+ M3 p" j9 U7 e& c' r
  6.         if (Request.QueryString["ex_id"] != null)3 g" k: A1 b& |' j8 O) ?
  7.         {
    7 U) ]6 e$ w" j9 n5 x: K6 |
  8.             int.TryParse(Request.QueryString["ex_id"], out this.ex_id);
    % A4 J- U5 ~* l3 Z* K" R$ ?
  9.             HttpCookie ex_id = new HttpCookie("ex_id", Request.QueryString["ex_id"].ToString());! b  Y3 }- {2 Z' z+ `; y6 ?, m
  10.             if (!Request.Browser.Cookies)
    * r, a9 V/ u' U/ P
  11.             {+ }/ I2 K0 b6 S) R/ Y$ {) b, \) k
  12.                 JavaScript.Alert("UserCookie_Unable", "请打开浏览器的cookie功能以保证有足够的操作时间,谢谢!");: A9 X7 J: |* G( m. I
  13.                 return;
    # V$ k! ?% o; I. s' K
  14.             }
    . K% i6 c6 ?! u% f) H2 h0 J1 u
  15.             Response.Cookies.Add(ex_id);
    . u" [6 u2 g4 U- F. O
  16.         }+ Y5 p& C; V2 W# t# B  G: F7 o, {
  17.         if (Request.QueryString["cm_id"] != null)5 L, Q2 s- B. a$ L$ @' `
  18.         {
    ) ^6 e# G3 b% R1 C3 n% [( G: g' o/ x% U
  19.             int.TryParse(Request.QueryString["cm_id"], out this.cm_id);* S! U3 n/ a+ Q6 p+ `. _$ ^$ `
  20.             HttpCookie cm_id = new HttpCookie("cm_id", Request.QueryString["cm_id"].ToString());7 N6 E( z" l8 _) l$ M0 J
  21.             if (!Request.Browser.Cookies)( k; I$ [) M) A% R
  22.             {
    . E1 ~3 b- o$ b7 I- f
  23.                 JavaScript.Alert("UserCookie_Unable", "请打开浏览器的cookie功能以保证有足够的操作时间,谢谢!");* _4 q! M! G0 C3 O, h) N
  24.                 return;2 `/ d1 y  v# `$ B2 w
  25.             }( V5 A; u; i& |7 O$ P' `
  26.             Response.Cookies.Add(cm_id);
    + t- U, K. Y1 p) q  {9 N: F
  27.         }
    4 i3 e2 N$ W& O3 O( l; T
  28.         if (Request.QueryString["pr_id"] != null)0 e; o; @( z( D# S4 Z  s# _
  29.         {
    * Q& x( y" e, X' |
  30.             int.TryParse(Request.QueryString["pr_id"], out this.pr_id);
    - s/ q6 J+ y. A( H
  31.             HttpCookie pr_id = new HttpCookie("pr_id", Request.QueryString["pr_id"].ToString());
    - y+ Y5 E: V; M  k/ J
  32.             if (!Request.Browser.Cookies)$ H$ b6 y5 o+ ^- y' F
  33.             {
    : b7 R7 i/ r& e0 I1 r( ^
  34.                 JavaScript.Alert("UserCookie_Unable", "请打开浏览器的cookie功能以保证有足够的操作时间,谢谢!");
    . k  l+ G0 M5 P$ d) l+ R2 w1 s$ n
  35.                 return;( O9 T4 p  x" B  M& n% a2 k
  36.             }
    4 v0 w: `, e- H2 d
  37.             Response.Cookies.Add(pr_id);" G% K; ^" ~6 T' U
  38.         }/ O; z- O# _/ M+ i' M6 P0 X& Z
  39.     }
复制代码
再在asax页面读取Cookie信息;
  1. //读Cookie信息,初始化为"-1",因为PracticePageBase是以-1进行判断的
    * w' P- q$ r4 _$ Q; e
  2.         string ex_id = "-1";
    ' a/ [( }5 h! i/ u0 B
  3.         string cm_id = "-1";
    5 b  l# z/ a8 h' \' X; X
  4.         string pr_id = "-1";
    5 a- T/ s& u2 y2 S9 g- N( Q8 P1 S
  5.         if (Request.Cookies["ex_id"] != null)
    ! v$ q5 t. `+ F$ g) {# m9 ]
  6.         {
    8 w' F" T7 N9 W' |+ @6 M
  7.             ex_id = Request.Cookies["ex_id"].Value;
    0 N2 Y. h# G( g
  8.         }! j1 [& L) F& \4 n/ s
  9.         if (Request.Cookies["cm_id"] != null)( l0 n3 B/ T: w7 ^
  10.         {- a4 {# [1 a; G. N
  11.             cm_id = Request.Cookies["cm_id"].Value;
    8 Y$ n$ s9 v3 \, J5 J' ]
  12.         }! d6 G( w' X( I
  13.         if (Request.Cookies["pr_id"] != null)/ R% n" a# W# J4 T, u* f
  14.         {
    2 x5 R! X# d! ]) M
  15.             pr_id = Request.Cookies["pr_id"].Value;
    4 l: f) T3 k+ V+ E& a  M/ @# ^9 S) I
  16.         }
复制代码
最后在重定向的时候将pr_id,ex_id,com_id再作为地址参数传递过去,在页面加载的时候就能加载到实践数据了
  1. //请求重定向到上载页面,并给用户提示信息,同时将实践ID等参数继续作为地址参数传递到页面上,这样页面才能够加载到实践数据。3 W0 h; e9 t# c/ h6 b9 U
  2.             context.Response.Redirect(this.Request.Url.LocalPath + "?error=" + Server.UrlEncode("请上传小于4M的文件!") + "&ex_id=" + ex_id + "&cm_id=" + cm_id + "&pr_id=" + pr_id);
复制代码
还有一点需要注意的就是:
  1. /*注意顺序以及IsPostBack*/        ' y, G! Z' N( ]. ]
  2.         this.LoadQueryString();* N3 l1 O1 O0 f7 K' F  X
  3.         this.LoadUserCookie();
    ' a6 j( i: T  O% C, H
  4.         if (!this.IsPostBack)//回传的话就不执行了,以防每次刷新页面都会进行提醒,因为Request.QueryString["error"]的内容没有改变7 D( A! @( }7 w5 P
  5.         {
      {* q$ D5 k1 i6 y
  6.             if (!String.IsNullOrEmpty(Request.QueryString["error"]))
    1 a2 ^3 |# y! c5 p3 X* a# d, h+ B2 L
  7.             {2 e- @$ W( @- _) T- R; \9 n
  8.                 string errMsg = Server.HtmlEncode(Request.QueryString["error"]);
    $ u& e' f& S# g8 G
  9.                 JavaScript.Alert(errMsg);
    2 c- G" [8 I8 _5 h
  10.                 this.LoadQueryString();' [, n& T1 c7 y8 P  _
  11.             }
    8 E3 e7 G4 [, E9 \7 Y
  12.         }
复制代码
错误提示,并且能正常重定向页面  e! }' j3 i0 i$ R
[attach]322[/attach]




欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/) Powered by Discuz! X3.2