Page.cs 26 KB

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