Page.cs 25 KB

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