Page.cs 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. //
  2. // System.Web.UI.Page.cs
  3. //
  4. // Authors:
  5. // Duncan Mak ([email protected])
  6. // Gonzalo Paniagua ([email protected])
  7. // Andreas Nahr ([email protected])
  8. //
  9. // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
  10. // (c) 2003 Novell, Inc. (http://www.novell.com)
  11. //
  12. using System;
  13. using System.Collections;
  14. using System.Collections.Specialized;
  15. using System.ComponentModel;
  16. using System.ComponentModel.Design;
  17. using System.ComponentModel.Design.Serialization;
  18. using System.Globalization;
  19. using System.IO;
  20. using System.Security.Principal;
  21. using System.Text;
  22. using System.Threading;
  23. using System.Web;
  24. using System.Web.Caching;
  25. using System.Web.SessionState;
  26. using System.Web.Util;
  27. namespace System.Web.UI
  28. {
  29. [MonoTODO ("FIXME missing the IRootDesigner Attribute")]
  30. [DefaultEvent ("Load"), DesignerCategory ("ASPXCodeBehind")]
  31. [ToolboxItem (false)]
  32. [Designer ("System.Web.UI.Design.ControlDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
  33. [RootDesignerSerializer ("Microsoft.VSDesigner.WebForms.RootCodeDomSerializer, " + Consts.AssemblyMicrosoft_VSDesigner, "System.ComponentModel.Design.Serialization.CodeDomSerializer, " + Consts.AssemblySystem_Design, true)]
  34. public class Page : TemplateControl, IHttpHandler
  35. {
  36. private bool _viewState = true;
  37. private bool _viewStateMac;
  38. private string _errorPage;
  39. private bool _isValid;
  40. private bool _smartNavigation;
  41. private int _transactionMode;
  42. private HttpContext _context;
  43. private ValidatorCollection _validators;
  44. private bool renderingForm;
  45. private object _savedViewState;
  46. private ArrayList _requiresPostBack;
  47. private ArrayList _requiresPostBackCopy;
  48. private ArrayList requiresPostDataChanged;
  49. private IPostBackEventHandler requiresRaiseEvent;
  50. private NameValueCollection secondPostData;
  51. private bool requiresPostBackScript;
  52. private bool postBackScriptRendered;
  53. private Hashtable registeredArrayDeclares;
  54. Hashtable clientScriptBlocks;
  55. Hashtable startupScriptBlocks;
  56. Hashtable hiddenFields;
  57. internal Hashtable submitStatements;
  58. bool handleViewState;
  59. string viewStateUserKey;
  60. NameValueCollection _requestValueCollection;
  61. [EditorBrowsable (EditorBrowsableState.Never)]
  62. protected const string postEventArgumentID = "__EVENTARGUMENT";
  63. [EditorBrowsable (EditorBrowsableState.Never)]
  64. protected const string postEventSourceID = "__EVENTTARGET";
  65. #region Constructor
  66. public Page ()
  67. {
  68. Page = this;
  69. }
  70. #endregion
  71. #region Properties
  72. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  73. [Browsable (false)]
  74. public HttpApplicationState Application
  75. {
  76. get { return _context.Application; }
  77. }
  78. [EditorBrowsable (EditorBrowsableState.Never)]
  79. protected bool AspCompatMode
  80. {
  81. set { throw new NotImplementedException (); }
  82. }
  83. [EditorBrowsable (EditorBrowsableState.Never)]
  84. protected bool Buffer
  85. {
  86. set { Response.BufferOutput = value; }
  87. }
  88. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  89. [Browsable (false)]
  90. public Cache Cache
  91. {
  92. get { return _context.Cache; }
  93. }
  94. [MonoTODO]
  95. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  96. [Browsable (false), DefaultValue ("")]
  97. [WebSysDescription ("Value do override the automatic browser detection and force the page to use the specified browser.")]
  98. public string ClientTarget
  99. {
  100. get { throw new NotImplementedException (); }
  101. set { throw new NotImplementedException (); }
  102. }
  103. [EditorBrowsable (EditorBrowsableState.Never)]
  104. protected int CodePage
  105. {
  106. set { Response.ContentEncoding = Encoding.GetEncoding (value); }
  107. }
  108. [EditorBrowsable (EditorBrowsableState.Never)]
  109. protected string ContentType
  110. {
  111. set { Response.ContentType = value; }
  112. }
  113. protected override HttpContext Context
  114. {
  115. get {
  116. if (_context == null)
  117. return HttpContext.Current;
  118. return _context;
  119. }
  120. }
  121. [EditorBrowsable (EditorBrowsableState.Never)]
  122. protected string Culture
  123. {
  124. set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
  125. }
  126. [Browsable (false)]
  127. public override bool EnableViewState
  128. {
  129. get { return _viewState; }
  130. set { _viewState = value; }
  131. }
  132. [EditorBrowsable (EditorBrowsableState.Never)]
  133. protected bool EnableViewStateMac
  134. {
  135. get { return _viewStateMac; }
  136. set { _viewStateMac = value; }
  137. }
  138. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  139. [Browsable (false), DefaultValue ("")]
  140. [WebSysDescription ("The URL of a page used for error redirection.")]
  141. public string ErrorPage
  142. {
  143. get { return _errorPage; }
  144. set {
  145. _errorPage = value;
  146. if (_context != null)
  147. _context.ErrorPage = value;
  148. }
  149. }
  150. [EditorBrowsable (EditorBrowsableState.Never)]
  151. protected ArrayList FileDependencies
  152. {
  153. set {
  154. if (Response != null)
  155. Response.AddFileDependencies (value);
  156. }
  157. }
  158. [Browsable (false)]
  159. public override string ID
  160. {
  161. get { return base.ID; }
  162. set { base.ID = value; }
  163. }
  164. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  165. [Browsable (false)]
  166. public bool IsPostBack
  167. {
  168. get {
  169. return (0 == String.Compare (Request.HttpMethod, "POST", true));
  170. }
  171. }
  172. [EditorBrowsable (EditorBrowsableState.Never), Browsable (false)]
  173. public bool IsReusable {
  174. get { return false; }
  175. }
  176. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  177. [Browsable (false)]
  178. public bool IsValid
  179. {
  180. get { return _isValid; }
  181. }
  182. [EditorBrowsable (EditorBrowsableState.Never)]
  183. protected int LCID {
  184. set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
  185. }
  186. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  187. [Browsable (false)]
  188. public HttpRequest Request
  189. {
  190. get { return _context.Request; }
  191. }
  192. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  193. [Browsable (false)]
  194. public HttpResponse Response
  195. {
  196. get { return _context.Response; }
  197. }
  198. [EditorBrowsable (EditorBrowsableState.Never)]
  199. protected string ResponseEncoding
  200. {
  201. set { Response.ContentEncoding = Encoding.GetEncoding (value); }
  202. }
  203. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  204. [Browsable (false)]
  205. public HttpServerUtility Server
  206. {
  207. get {
  208. return Context.Server;
  209. }
  210. }
  211. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  212. [Browsable (false)]
  213. public virtual HttpSessionState Session
  214. {
  215. get {
  216. if (_context.Session == null)
  217. throw new HttpException ("Session state can only be used " +
  218. "when enableSessionState is set to true, either " +
  219. "in a configuration file or in the Page directive.");
  220. return _context.Session;
  221. }
  222. }
  223. [Browsable (false)]
  224. public bool SmartNavigation
  225. {
  226. get { return _smartNavigation; }
  227. set { _smartNavigation = value; }
  228. }
  229. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  230. [Browsable (false)]
  231. public TraceContext Trace
  232. {
  233. get { return Context.Trace; }
  234. }
  235. [EditorBrowsable (EditorBrowsableState.Never)]
  236. protected bool TraceEnabled
  237. {
  238. set { Trace.IsEnabled = value; }
  239. }
  240. [EditorBrowsable (EditorBrowsableState.Never)]
  241. protected TraceMode TraceModeValue
  242. {
  243. set { Trace.TraceMode = value; }
  244. }
  245. [EditorBrowsable (EditorBrowsableState.Never)]
  246. protected int TransactionMode
  247. {
  248. set { _transactionMode = value; }
  249. }
  250. [EditorBrowsable (EditorBrowsableState.Never)]
  251. protected string UICulture
  252. {
  253. set { Thread.CurrentThread.CurrentUICulture = new CultureInfo (value); }
  254. }
  255. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  256. [Browsable (false)]
  257. public IPrincipal User
  258. {
  259. get { return _context.User; }
  260. }
  261. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  262. [Browsable (false)]
  263. public ValidatorCollection Validators
  264. {
  265. get {
  266. if (_validators == null)
  267. _validators = new ValidatorCollection ();
  268. return _validators;
  269. }
  270. }
  271. [MonoTODO ("Use this when encrypting/decrypting ViewState")]
  272. [Browsable (false)]
  273. public string ViewStateUserKey {
  274. get { return viewStateUserKey; }
  275. set { viewStateUserKey = value; }
  276. }
  277. [Browsable (false)]
  278. public override bool Visible
  279. {
  280. get { return base.Visible; }
  281. set { base.Visible = value; }
  282. }
  283. #endregion
  284. #region Methods
  285. [EditorBrowsable (EditorBrowsableState.Never)]
  286. protected IAsyncResult AspCompatBeginProcessRequest (HttpContext context,
  287. AsyncCallback cb,
  288. object extraData)
  289. {
  290. throw new NotImplementedException ();
  291. }
  292. [EditorBrowsable (EditorBrowsableState.Never)]
  293. protected void AspCompatEndProcessRequest (IAsyncResult result)
  294. {
  295. throw new NotImplementedException ();
  296. }
  297. [EditorBrowsable (EditorBrowsableState.Advanced)]
  298. protected virtual HtmlTextWriter CreateHtmlTextWriter (TextWriter tw)
  299. {
  300. return new HtmlTextWriter (tw);
  301. }
  302. [EditorBrowsable (EditorBrowsableState.Never)]
  303. public void DesignerInitialize ()
  304. {
  305. InitRecursive (null);
  306. }
  307. [EditorBrowsable (EditorBrowsableState.Advanced)]
  308. protected virtual NameValueCollection DeterminePostBackMode ()
  309. {
  310. if (_context == null)
  311. return null;
  312. HttpRequest req = _context.Request;
  313. if (req == null)
  314. return null;
  315. NameValueCollection coll = null;
  316. if (IsPostBack)
  317. coll = req.Form;
  318. else
  319. coll = req.QueryString;
  320. if (coll == null || coll ["__VIEWSTATE"] == null)
  321. return null;
  322. return coll;
  323. }
  324. [EditorBrowsable (EditorBrowsableState.Advanced)]
  325. public string GetPostBackClientEvent (Control control, string argument)
  326. {
  327. return GetPostBackEventReference (control, argument);
  328. }
  329. [EditorBrowsable (EditorBrowsableState.Advanced)]
  330. public string GetPostBackClientHyperlink (Control control, string argument)
  331. {
  332. return "javascript:" + GetPostBackEventReference (control, argument);
  333. }
  334. [EditorBrowsable (EditorBrowsableState.Advanced)]
  335. public string GetPostBackEventReference (Control control)
  336. {
  337. return GetPostBackEventReference (control, "");
  338. }
  339. [EditorBrowsable (EditorBrowsableState.Advanced)]
  340. public string GetPostBackEventReference (Control control, string argument)
  341. {
  342. RequiresPostBackScript ();
  343. return String.Format ("__doPostBack('{0}','{1}')", control.UniqueID, argument);
  344. }
  345. internal void RequiresPostBackScript ()
  346. {
  347. requiresPostBackScript = true;
  348. }
  349. [EditorBrowsable (EditorBrowsableState.Never)]
  350. public virtual int GetTypeHashCode ()
  351. {
  352. return 0;
  353. }
  354. [EditorBrowsable (EditorBrowsableState.Never)]
  355. protected virtual void InitOutputCache (int duration,
  356. string varyByHeader,
  357. string varyByCustom,
  358. OutputCacheLocation location,
  359. string varyByParam)
  360. {
  361. HttpCachePolicy cache = _context.Response.Cache;
  362. bool set_vary = false;
  363. switch (location) {
  364. case OutputCacheLocation.Any:
  365. cache.SetCacheability (HttpCacheability.Public);
  366. cache.SetMaxAge (new TimeSpan (0, 0, duration));
  367. cache.SetLastModified (_context.Timestamp);
  368. set_vary = true;
  369. break;
  370. case OutputCacheLocation.Client:
  371. cache.SetCacheability (HttpCacheability.Private);
  372. cache.SetMaxAge (new TimeSpan (0, 0, duration));
  373. cache.SetLastModified (_context.Timestamp);
  374. break;
  375. case OutputCacheLocation.Downstream:
  376. cache.SetCacheability (HttpCacheability.Public);
  377. cache.SetMaxAge (new TimeSpan (0, 0, duration));
  378. cache.SetLastModified (_context.Timestamp);
  379. break;
  380. case OutputCacheLocation.Server:
  381. cache.SetCacheability (HttpCacheability.Server);
  382. set_vary = true;
  383. break;
  384. case OutputCacheLocation.None:
  385. break;
  386. }
  387. if (set_vary) {
  388. if (varyByCustom != null)
  389. cache.SetVaryByCustom (varyByCustom);
  390. if (varyByParam != null && varyByParam.Length > 0) {
  391. string[] prms = varyByParam.Split (';');
  392. foreach (string p in prms)
  393. cache.VaryByParams [p.Trim ()] = true;
  394. cache.VaryByParams.IgnoreParams = false;
  395. } else {
  396. cache.VaryByParams.IgnoreParams = true;
  397. }
  398. if (varyByHeader != null && varyByHeader.Length > 0) {
  399. string[] hdrs = varyByHeader.Split (';');
  400. foreach (string h in hdrs)
  401. cache.VaryByHeaders [h.Trim ()] = true;
  402. }
  403. }
  404. cache.Duration = duration;
  405. cache.SetExpires (_context.Timestamp.AddSeconds (duration));
  406. }
  407. [EditorBrowsable (EditorBrowsableState.Advanced)]
  408. public bool IsClientScriptBlockRegistered (string key)
  409. {
  410. if (clientScriptBlocks == null)
  411. return false;
  412. return clientScriptBlocks.ContainsKey (key);
  413. }
  414. [EditorBrowsable (EditorBrowsableState.Advanced)]
  415. public bool IsStartupScriptRegistered (string key)
  416. {
  417. if (startupScriptBlocks == null)
  418. return false;
  419. return startupScriptBlocks.ContainsKey (key);
  420. }
  421. public string MapPath (string virtualPath)
  422. {
  423. return Request.MapPath (virtualPath);
  424. }
  425. private void RenderPostBackScript (HtmlTextWriter writer, string formUniqueID)
  426. {
  427. writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" value=\"\" />", postEventSourceID);
  428. writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" value=\"\" />", postEventArgumentID);
  429. writer.WriteLine ();
  430. writer.WriteLine ("<script language=\"javascript\">");
  431. writer.WriteLine ("<!--");
  432. writer.WriteLine ("\tfunction __doPostBack(eventTarget, eventArgument) {");
  433. writer.WriteLine ("\t\tvar theform = document.getElementById ('{0}');", formUniqueID);
  434. writer.WriteLine ("\t\ttheform.{0}.value = eventTarget;", postEventSourceID);
  435. writer.WriteLine ("\t\ttheform.{0}.value = eventArgument;", postEventArgumentID);
  436. writer.WriteLine ("\t\ttheform.submit();");
  437. writer.WriteLine ("\t}");
  438. writer.WriteLine ("// -->");
  439. writer.WriteLine ("</script>");
  440. }
  441. static void WriteScripts (HtmlTextWriter writer, Hashtable scripts)
  442. {
  443. if (scripts == null)
  444. return;
  445. foreach (string key in scripts.Values)
  446. writer.WriteLine (key);
  447. }
  448. void WriteHiddenFields (HtmlTextWriter writer)
  449. {
  450. if (hiddenFields == null)
  451. return;
  452. foreach (string key in hiddenFields.Keys) {
  453. string value = hiddenFields [key] as string;
  454. writer.WriteLine ("\n<input type=\"hidden\" name=\"{0}\" value=\"{1}\" />", key, value);
  455. }
  456. hiddenFields = null;
  457. }
  458. internal void OnFormRender (HtmlTextWriter writer, string formUniqueID)
  459. {
  460. if (renderingForm)
  461. throw new HttpException ("Only 1 HtmlForm is allowed per page.");
  462. renderingForm = true;
  463. writer.WriteLine ();
  464. WriteHiddenFields (writer);
  465. if (requiresPostBackScript) {
  466. RenderPostBackScript (writer, formUniqueID);
  467. postBackScriptRendered = true;
  468. }
  469. if (handleViewState) {
  470. string vs = GetViewStateString ();
  471. writer.Write ("<input type=\"hidden\" name=\"__VIEWSTATE\" ");
  472. writer.WriteLine ("value=\"{0}\" />", vs);
  473. }
  474. WriteScripts (writer, clientScriptBlocks);
  475. }
  476. internal string GetViewStateString ()
  477. {
  478. StringWriter sr = new StringWriter ();
  479. LosFormatter fmt = new LosFormatter ();
  480. fmt.Serialize (sr, _savedViewState);
  481. return sr.GetStringBuilder ().ToString ();
  482. }
  483. internal void OnFormPostRender (HtmlTextWriter writer, string formUniqueID)
  484. {
  485. if (registeredArrayDeclares != null) {
  486. writer.WriteLine();
  487. writer.WriteLine("<script language=\"javascript\">");
  488. writer.WriteLine("<!--");
  489. IDictionaryEnumerator arrayEnum = registeredArrayDeclares.GetEnumerator();
  490. while (arrayEnum.MoveNext()) {
  491. writer.Write("\tvar ");
  492. writer.Write(arrayEnum.Key);
  493. writer.Write(" = new Array(");
  494. IEnumerator arrayListEnum = ((ArrayList) arrayEnum.Value).GetEnumerator();
  495. bool isFirst = true;
  496. while (arrayListEnum.MoveNext()) {
  497. if (isFirst)
  498. isFirst = false;
  499. else
  500. writer.Write(", ");
  501. writer.Write(arrayListEnum.Current);
  502. }
  503. writer.WriteLine(");");
  504. }
  505. writer.WriteLine("// -->");
  506. writer.WriteLine("</script>");
  507. writer.WriteLine();
  508. }
  509. if (!postBackScriptRendered && requiresPostBackScript)
  510. RenderPostBackScript (writer, formUniqueID);
  511. WriteHiddenFields (writer);
  512. WriteScripts (writer, startupScriptBlocks);
  513. renderingForm = false;
  514. postBackScriptRendered = false;
  515. }
  516. private void ProcessPostData (NameValueCollection data, bool second)
  517. {
  518. if (data == null)
  519. return;
  520. if (_requiresPostBackCopy == null && _requiresPostBack != null)
  521. _requiresPostBackCopy = (ArrayList) _requiresPostBack.Clone ();
  522. Hashtable used = new Hashtable ();
  523. foreach (string id in data.AllKeys){
  524. if (id == "__VIEWSTATE" || id == postEventSourceID || id == postEventArgumentID)
  525. continue;
  526. string real_id = id;
  527. int dot = real_id.IndexOf ('.');
  528. if (dot >= 1)
  529. real_id = real_id.Substring (0, dot);
  530. if (real_id == null || used.ContainsKey (real_id))
  531. continue;
  532. used.Add (real_id, real_id);
  533. Control ctrl = FindControl (real_id);
  534. if (ctrl != null){
  535. IPostBackDataHandler pbdh = ctrl as IPostBackDataHandler;
  536. IPostBackEventHandler pbeh = ctrl as IPostBackEventHandler;
  537. if (pbdh == null) {
  538. if (pbeh != null)
  539. RegisterRequiresRaiseEvent (pbeh);
  540. continue;
  541. }
  542. if (pbdh.LoadPostData (real_id, data) == true) {
  543. if (requiresPostDataChanged == null)
  544. requiresPostDataChanged = new ArrayList ();
  545. requiresPostDataChanged.Add (pbdh);
  546. if (_requiresPostBackCopy != null)
  547. _requiresPostBackCopy.Remove (ctrl.UniqueID);
  548. }
  549. } else if (!second) {
  550. if (secondPostData == null)
  551. secondPostData = new NameValueCollection ();
  552. secondPostData.Add (real_id, data [id]);
  553. }
  554. }
  555. if (_requiresPostBackCopy != null && _requiresPostBackCopy.Count > 0) {
  556. string [] handlers = (string []) _requiresPostBackCopy.ToArray (typeof (string));
  557. foreach (string id in handlers) {
  558. IPostBackDataHandler pbdh = FindControl (id) as IPostBackDataHandler;
  559. if (pbdh == null)
  560. continue;
  561. _requiresPostBackCopy.Remove (id);
  562. if (pbdh.LoadPostData (id, data)) {
  563. if (requiresPostDataChanged == null)
  564. requiresPostDataChanged = new ArrayList ();
  565. requiresPostDataChanged.Add (pbdh);
  566. }
  567. }
  568. }
  569. }
  570. [EditorBrowsable (EditorBrowsableState.Never)]
  571. public void ProcessRequest (HttpContext context)
  572. {
  573. _context = context;
  574. WireupAutomaticEvents ();
  575. //-- Control execution lifecycle in the docs
  576. // Save culture information because it can be modified in FrameworkInitialize()
  577. CultureInfo culture = Thread.CurrentThread.CurrentCulture;
  578. CultureInfo uiculture = Thread.CurrentThread.CurrentUICulture;
  579. FrameworkInitialize ();
  580. context.ErrorPage = _errorPage;
  581. try {
  582. InternalProcessRequest ();
  583. } finally {
  584. try {
  585. UnloadRecursive (true);
  586. } catch {}
  587. Thread.CurrentThread.CurrentCulture = culture;
  588. Thread.CurrentThread.CurrentUICulture = uiculture;
  589. }
  590. }
  591. void InternalProcessRequest ()
  592. {
  593. _requestValueCollection = this.DeterminePostBackMode();
  594. Trace.Write ("aspx.page", "Begin Init");
  595. InitRecursive (null);
  596. Trace.Write ("aspx.page", "End Init");
  597. renderingForm = false;
  598. if (IsPostBack) {
  599. Trace.Write ("aspx.page", "Begin LoadViewState");
  600. LoadPageViewState ();
  601. Trace.Write ("aspx.page", "End LoadViewState");
  602. Trace.Write ("aspx.page", "Begin ProcessPostData");
  603. ProcessPostData (_requestValueCollection, false);
  604. Trace.Write ("aspx.page", "End ProcessPostData");
  605. }
  606. LoadRecursive ();
  607. if (IsPostBack) {
  608. Trace.Write ("aspx.page", "Begin ProcessPostData Second Try");
  609. ProcessPostData (secondPostData, true);
  610. Trace.Write ("aspx.page", "End ProcessPostData Second Try");
  611. Trace.Write ("aspx.page", "Begin Raise ChangedEvents");
  612. RaiseChangedEvents ();
  613. Trace.Write ("aspx.page", "End Raise ChangedEvents");
  614. Trace.Write ("aspx.page", "Begin Raise PostBackEvent");
  615. RaisePostBackEvents ();
  616. Trace.Write ("aspx.page", "End Raise PostBackEvent");
  617. }
  618. Trace.Write ("aspx.page", "Begin PreRender");
  619. PreRenderRecursiveInternal ();
  620. Trace.Write ("aspx.page", "End PreRender");
  621. Trace.Write ("aspx.page", "Begin SaveViewState");
  622. SavePageViewState ();
  623. Trace.Write ("aspx.page", "End SaveViewState");
  624. //--
  625. Trace.Write ("aspx.page", "Begin Render");
  626. HtmlTextWriter output = new HtmlTextWriter (_context.Response.Output);
  627. RenderControl (output);
  628. Trace.Write ("aspx.page", "End Render");
  629. RenderTrace (output);
  630. _context = null;
  631. }
  632. private void RenderTrace (HtmlTextWriter output)
  633. {
  634. TraceManager manager = HttpRuntime.TraceManager;
  635. if (!Trace.IsEnabled && !manager.Enabled)
  636. return;
  637. Trace.SaveData ();
  638. if (Trace.IsEnabled || manager.PageOutput)
  639. Trace.Render (output);
  640. }
  641. internal void RaisePostBackEvents ()
  642. {
  643. if (requiresRaiseEvent != null) {
  644. RaisePostBackEvent (requiresRaiseEvent, null);
  645. return;
  646. }
  647. NameValueCollection postdata = _requestValueCollection;
  648. if (postdata == null)
  649. return;
  650. string eventTarget = postdata [postEventSourceID];
  651. if (eventTarget == null || eventTarget.Length == 0) {
  652. Validate ();
  653. return;
  654. }
  655. IPostBackEventHandler target = FindControl (eventTarget) as IPostBackEventHandler;
  656. if (target == null)
  657. return;
  658. string eventArgument = postdata [postEventArgumentID];
  659. RaisePostBackEvent (target, eventArgument);
  660. }
  661. internal void RaiseChangedEvents ()
  662. {
  663. if (requiresPostDataChanged == null)
  664. return;
  665. foreach (IPostBackDataHandler ipdh in requiresPostDataChanged)
  666. ipdh.RaisePostDataChangedEvent ();
  667. requiresPostDataChanged = null;
  668. }
  669. [EditorBrowsable (EditorBrowsableState.Advanced)]
  670. protected virtual void RaisePostBackEvent (IPostBackEventHandler sourceControl, string eventArgument)
  671. {
  672. sourceControl.RaisePostBackEvent (eventArgument);
  673. }
  674. [EditorBrowsable (EditorBrowsableState.Advanced)]
  675. public void RegisterArrayDeclaration (string arrayName, string arrayValue)
  676. {
  677. if (registeredArrayDeclares == null)
  678. registeredArrayDeclares = new Hashtable();
  679. if (!registeredArrayDeclares.ContainsKey (arrayName))
  680. registeredArrayDeclares.Add (arrayName, new ArrayList());
  681. ((ArrayList) registeredArrayDeclares[arrayName]).Add(arrayValue);
  682. }
  683. [EditorBrowsable (EditorBrowsableState.Advanced)]
  684. public virtual void RegisterClientScriptBlock (string key, string script)
  685. {
  686. if (IsClientScriptBlockRegistered (key))
  687. return;
  688. if (clientScriptBlocks == null)
  689. clientScriptBlocks = new Hashtable ();
  690. clientScriptBlocks.Add (key, script);
  691. }
  692. [EditorBrowsable (EditorBrowsableState.Advanced)]
  693. public virtual void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue)
  694. {
  695. if (hiddenFields == null)
  696. hiddenFields = new Hashtable ();
  697. if (!hiddenFields.ContainsKey (hiddenFieldName))
  698. hiddenFields.Add (hiddenFieldName, hiddenFieldInitialValue);
  699. }
  700. [MonoTODO("Used in HtmlForm")]
  701. internal void RegisterClientScriptFile (string a, string b, string c)
  702. {
  703. throw new NotImplementedException ();
  704. }
  705. [MonoTODO]
  706. [EditorBrowsable (EditorBrowsableState.Advanced)]
  707. public void RegisterOnSubmitStatement (string key, string script)
  708. {
  709. if (submitStatements == null)
  710. submitStatements = new Hashtable ();
  711. if (submitStatements.ContainsKey (key))
  712. return;
  713. submitStatements.Add (key, script);
  714. }
  715. [EditorBrowsable (EditorBrowsableState.Advanced)]
  716. public void RegisterRequiresPostBack (Control control)
  717. {
  718. if (_requiresPostBack == null)
  719. _requiresPostBack = new ArrayList ();
  720. _requiresPostBack.Add (control.UniqueID);
  721. }
  722. [EditorBrowsable (EditorBrowsableState.Advanced)]
  723. public virtual void RegisterRequiresRaiseEvent (IPostBackEventHandler control)
  724. {
  725. requiresRaiseEvent = control;
  726. }
  727. [EditorBrowsable (EditorBrowsableState.Advanced)]
  728. public virtual void RegisterStartupScript (string key, string script)
  729. {
  730. if (IsStartupScriptRegistered (key))
  731. return;
  732. if (startupScriptBlocks == null)
  733. startupScriptBlocks = new Hashtable ();
  734. startupScriptBlocks.Add (key, script);
  735. }
  736. [EditorBrowsable (EditorBrowsableState.Advanced)]
  737. public void RegisterViewStateHandler ()
  738. {
  739. handleViewState = true;
  740. }
  741. [EditorBrowsable (EditorBrowsableState.Advanced)]
  742. protected virtual void SavePageStateToPersistenceMedium (object viewState)
  743. {
  744. _savedViewState = viewState;
  745. }
  746. [EditorBrowsable (EditorBrowsableState.Advanced)]
  747. protected virtual object LoadPageStateFromPersistenceMedium ()
  748. {
  749. NameValueCollection postdata = _requestValueCollection;
  750. string view_state;
  751. if (postdata == null || (view_state = postdata ["__VIEWSTATE"]) == null)
  752. return null;
  753. _savedViewState = null;
  754. LosFormatter fmt = new LosFormatter ();
  755. try {
  756. _savedViewState = fmt.Deserialize (view_state);
  757. } catch (Exception e) {
  758. throw new HttpException ("Error restoring page viewstate.\n", e);
  759. }
  760. return _savedViewState;
  761. }
  762. internal void LoadPageViewState()
  763. {
  764. object sState = LoadPageStateFromPersistenceMedium ();
  765. if (sState != null) {
  766. Pair pair = (Pair) sState;
  767. LoadViewStateRecursive (pair.First);
  768. _requiresPostBack = pair.Second as ArrayList;
  769. }
  770. }
  771. internal void SavePageViewState ()
  772. {
  773. if (!handleViewState)
  774. return;
  775. Pair pair = new Pair ();
  776. pair.First = SaveViewStateRecursive ();
  777. if (_requiresPostBack != null && _requiresPostBack.Count > 0)
  778. pair.Second = _requiresPostBack;
  779. if (pair.First == null && pair.Second == null)
  780. pair = null;
  781. SavePageStateToPersistenceMedium (pair);
  782. }
  783. public virtual void Validate ()
  784. {
  785. if (_validators == null || _validators.Count == 0){
  786. _isValid = true;
  787. return;
  788. }
  789. bool all_valid = true;
  790. foreach (IValidator v in _validators){
  791. v.Validate ();
  792. if (v.IsValid == false)
  793. all_valid = false;
  794. }
  795. if (all_valid)
  796. _isValid = true;
  797. }
  798. [EditorBrowsable (EditorBrowsableState.Advanced)]
  799. public virtual void VerifyRenderingInServerForm (Control control)
  800. {
  801. if (!renderingForm)
  802. throw new HttpException ("Control '" + control.ClientID + " " + control.GetType () +
  803. "' must be rendered within a HtmlForm");
  804. }
  805. #endregion
  806. #if NET_2_0
  807. public string GetWebResourceUrl(Type type, string resourceName)
  808. {
  809. if (type == null)
  810. throw new ArgumentNullException ("type");
  811. if (resourceName == null || resourceName.Length == 0)
  812. throw new ArgumentNullException ("type");
  813. return System.Web.Handlers.AssemblyResourceLoader.GetResourceUrl (type, resourceName);
  814. }
  815. Stack dataItemCtx;
  816. internal void PushDataItemContext (object o)
  817. {
  818. if (dataItemCtx == null)
  819. dataItemCtx = new Stack ();
  820. dataItemCtx.Push (o);
  821. }
  822. internal void PopDataItemContext ()
  823. {
  824. if (dataItemCtx == null)
  825. throw new InvalidOperationException ();
  826. dataItemCtx.Pop ();
  827. }
  828. internal object CurrentDataItem {
  829. get {
  830. if (dataItemCtx == null)
  831. throw new InvalidOperationException ("No data item");
  832. return dataItemCtx.Peek ();
  833. }
  834. }
  835. protected object Eval (string expression)
  836. {
  837. return DataBinder.Eval (CurrentDataItem, expression);
  838. }
  839. protected object Eval (string expression, string format)
  840. {
  841. return DataBinder.Eval (CurrentDataItem, expression, format);
  842. }
  843. protected object XPath (string xpathexpression)
  844. {
  845. return XPathBinder.Eval (CurrentDataItem, xpathexpression);
  846. }
  847. protected object XPath (string xpathexpression, string format)
  848. {
  849. return XPathBinder.Eval (CurrentDataItem, xpathexpression, format);
  850. }
  851. protected IEnumerable XPathSelect (string xpathexpression)
  852. {
  853. return XPathBinder.Select (CurrentDataItem, xpathexpression);
  854. }
  855. #endif
  856. }
  857. }