2 // System.Web.UI.Page.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Gonzalo Paniagua (gonzalo@ximian.com)
7 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
9 // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
10 // (c) 2003 Novell, Inc. (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Collections;
36 using System.Collections.Specialized;
37 using System.ComponentModel;
38 using System.ComponentModel.Design;
39 using System.ComponentModel.Design.Serialization;
40 using System.Globalization;
42 using System.Security.Principal;
44 using System.Threading;
46 using System.Web.Caching;
47 using System.Web.SessionState;
48 using System.Web.Util;
50 namespace System.Web.UI
54 [RootDesignerSerializer ("Microsoft.VSDesigner.WebForms.RootCodeDomSerializer, " + Consts.AssemblyMicrosoft_VSDesigner, "System.ComponentModel.Design.Serialization.CodeDomSerializer, " + Consts.AssemblySystem_Design, true)]
56 [DefaultEvent ("Load"), DesignerCategory ("ASPXCodeBehind")]
58 [Designer ("System.Web.UI.Design.ControlDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
59 public class Page : TemplateControl, IHttpHandler
61 private bool _viewState = true;
62 private bool _viewStateMac;
63 private string _errorPage;
64 private bool _isValid;
65 private bool _smartNavigation;
66 private int _transactionMode;
67 private HttpContext _context;
68 private ValidatorCollection _validators;
69 private bool renderingForm;
70 private object _savedViewState;
71 private ArrayList _requiresPostBack;
72 private ArrayList _requiresPostBackCopy;
73 private ArrayList requiresPostDataChanged;
74 private IPostBackEventHandler requiresRaiseEvent;
75 private NameValueCollection secondPostData;
76 private bool requiresPostBackScript;
77 private bool postBackScriptRendered;
79 string viewStateUserKey;
80 NameValueCollection _requestValueCollection;
82 ClientScriptManager scriptManager = new ClientScriptManager ();
84 [EditorBrowsable (EditorBrowsableState.Never)]
85 protected const string postEventArgumentID = "__EVENTARGUMENT";
86 [EditorBrowsable (EditorBrowsableState.Never)]
87 protected const string postEventSourceID = "__EVENTTARGET";
90 private const string callbackArgumentID = "__CALLBACKARGUMENT";
91 private const string callbackSourceID = "__CALLBACKTARGET";
92 private const string previousPageID = "__PREVIOUSPAGE";
94 IPageHeader htmlHeader;
96 MasterPage masterPage;
97 string masterPageFile;
100 bool isCrossPagePostBack;
101 ArrayList requireStateControls;
102 Hashtable _validatorsByGroup;
115 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
117 public HttpApplicationState Application
119 get { return _context.Application; }
122 [EditorBrowsable (EditorBrowsableState.Never)]
124 public bool AspCompatMode
126 get { return false; }
127 set { throw new NotImplementedException (); }
130 protected bool AspCompatMode
132 set { throw new NotImplementedException (); }
136 [EditorBrowsable (EditorBrowsableState.Never)]
138 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
139 [BrowsableAttribute (false)]
142 get { return Response.BufferOutput; }
143 set { Response.BufferOutput = value; }
146 protected bool Buffer
148 set { Response.BufferOutput = value; }
152 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
156 get { return _context.Cache; }
160 [EditorBrowsableAttribute (EditorBrowsableState.Advanced)]
162 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
163 [Browsable (false), DefaultValue ("")]
164 [WebSysDescription ("Value do override the automatic browser detection and force the page to use the specified browser.")]
165 public string ClientTarget
167 get { return (clientTarget == null) ? "" : clientTarget; }
169 clientTarget = value;
175 [EditorBrowsable (EditorBrowsableState.Never)]
177 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
178 [BrowsableAttribute (false)]
181 get { return Response.ContentEncoding.CodePage; }
182 set { Response.ContentEncoding = Encoding.GetEncoding (value); }
185 protected int CodePage
187 set { Response.ContentEncoding = Encoding.GetEncoding (value); }
191 [EditorBrowsable (EditorBrowsableState.Never)]
193 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
194 [BrowsableAttribute (false)]
195 public string ContentType
197 get { return Response.ContentType; }
198 set { Response.ContentType = value; }
201 protected string ContentType
203 set { Response.ContentType = value; }
207 protected override HttpContext Context
210 if (_context == null)
211 return HttpContext.Current;
217 [EditorBrowsable (EditorBrowsableState.Never)]
219 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
220 [BrowsableAttribute (false)]
221 public string Culture
223 get { return Thread.CurrentThread.CurrentCulture.Name; }
224 set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
227 protected string Culture
229 set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
234 public override bool EnableViewState
236 get { return _viewState; }
237 set { _viewState = value; }
241 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
242 [BrowsableAttribute (false)]
244 [EditorBrowsable (EditorBrowsableState.Never)]
245 protected bool EnableViewStateMac
247 get { return _viewStateMac; }
248 set { _viewStateMac = value; }
251 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
252 [Browsable (false), DefaultValue ("")]
253 [WebSysDescription ("The URL of a page used for error redirection.")]
254 public string ErrorPage
256 get { return _errorPage; }
259 if (_context != null)
260 _context.ErrorPage = value;
267 [EditorBrowsable (EditorBrowsableState.Never)]
268 protected ArrayList FileDependencies
271 if (Response != null)
272 Response.AddFileDependencies (value);
277 public override string ID
279 get { return base.ID; }
280 set { base.ID = value; }
283 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
285 public bool IsPostBack
288 return _requestValueCollection != null;
292 [EditorBrowsable (EditorBrowsableState.Never), Browsable (false)]
293 public bool IsReusable {
294 get { return false; }
297 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
301 get { return _isValid; }
304 [EditorBrowsable (EditorBrowsableState.Never)]
306 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
307 [BrowsableAttribute (false)]
309 get { return Thread.CurrentThread.CurrentCulture.LCID; }
310 set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
314 set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
318 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
320 public HttpRequest Request
322 get { return _context.Request; }
325 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
327 public HttpResponse Response
329 get { return _context.Response; }
332 [EditorBrowsable (EditorBrowsableState.Never)]
334 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
335 [BrowsableAttribute (false)]
336 public string ResponseEncoding
338 get { return Response.ContentEncoding.WebName; }
339 set { Response.ContentEncoding = Encoding.GetEncoding (value); }
342 protected string ResponseEncoding
344 set { Response.ContentEncoding = Encoding.GetEncoding (value); }
348 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
350 public HttpServerUtility Server
353 return Context.Server;
357 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
359 public virtual HttpSessionState Session
362 if (_context.Session == null)
363 throw new HttpException ("Session state can only be used " +
364 "when enableSessionState is set to true, either " +
365 "in a configuration file or in the Page directive.");
367 return _context.Session;
372 [FilterableAttribute (false)]
375 public bool SmartNavigation
377 get { return _smartNavigation; }
378 set { _smartNavigation = value; }
381 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
383 public TraceContext Trace
385 get { return Context.Trace; }
388 [EditorBrowsable (EditorBrowsableState.Never)]
390 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
391 [BrowsableAttribute (false)]
392 public bool TraceEnabled
394 get { return Trace.IsEnabled; }
395 set { Trace.IsEnabled = value; }
398 protected bool TraceEnabled
400 set { Trace.IsEnabled = value; }
404 [EditorBrowsable (EditorBrowsableState.Never)]
406 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
407 [BrowsableAttribute (false)]
408 public TraceMode TraceModeValue
410 get { return Trace.TraceMode; }
411 set { Trace.TraceMode = value; }
414 protected TraceMode TraceModeValue
416 set { Trace.TraceMode = value; }
420 [EditorBrowsable (EditorBrowsableState.Never)]
422 public int TransactionMode
424 get { return _transactionMode; }
425 set { _transactionMode = value; }
428 protected int TransactionMode
430 set { _transactionMode = value; }
434 [EditorBrowsable (EditorBrowsableState.Never)]
436 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
437 [BrowsableAttribute (false)]
438 public string UICulture
440 get { return Thread.CurrentThread.CurrentUICulture.Name; }
441 set { Thread.CurrentThread.CurrentUICulture = new CultureInfo (value); }
444 protected string UICulture
446 set { Thread.CurrentThread.CurrentUICulture = new CultureInfo (value); }
450 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
452 public IPrincipal User
454 get { return _context.User; }
457 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
459 public ValidatorCollection Validators
462 if (_validators == null)
463 _validators = new ValidatorCollection ();
468 [MonoTODO ("Use this when encrypting/decrypting ViewState")]
470 public string ViewStateUserKey {
471 get { return viewStateUserKey; }
472 set { viewStateUserKey = value; }
476 public override bool Visible
478 get { return base.Visible; }
479 set { base.Visible = value; }
486 [EditorBrowsable (EditorBrowsableState.Never)]
487 protected IAsyncResult AspCompatBeginProcessRequest (HttpContext context,
491 throw new NotImplementedException ();
494 [EditorBrowsable (EditorBrowsableState.Never)]
495 protected void AspCompatEndProcessRequest (IAsyncResult result)
497 throw new NotImplementedException ();
500 [EditorBrowsable (EditorBrowsableState.Advanced)]
501 protected virtual HtmlTextWriter CreateHtmlTextWriter (TextWriter tw)
503 return new HtmlTextWriter (tw);
506 [EditorBrowsable (EditorBrowsableState.Never)]
507 public void DesignerInitialize ()
509 InitRecursive (null);
512 [EditorBrowsable (EditorBrowsableState.Advanced)]
513 protected virtual NameValueCollection DeterminePostBackMode ()
515 if (_context == null)
518 HttpRequest req = _context.Request;
522 NameValueCollection coll = null;
523 if (0 == String.Compare (Request.HttpMethod, "POST", true))
526 coll = req.QueryString;
529 if (coll == null || coll ["__VIEWSTATE"] == null)
535 [EditorBrowsable (EditorBrowsableState.Advanced)]
536 public string GetPostBackClientEvent (Control control, string argument)
538 return GetPostBackEventReference (control, argument);
541 [EditorBrowsable (EditorBrowsableState.Advanced)]
542 public string GetPostBackClientHyperlink (Control control, string argument)
544 return "javascript:" + GetPostBackEventReference (control, argument);
547 [EditorBrowsable (EditorBrowsableState.Advanced)]
548 public string GetPostBackEventReference (Control control)
550 return GetPostBackEventReference (control, "");
553 [EditorBrowsable (EditorBrowsableState.Advanced)]
554 public string GetPostBackEventReference (Control control, string argument)
556 RequiresPostBackScript ();
557 return String.Format ("__doPostBack('{0}','{1}')", control.UniqueID, argument);
560 internal void RequiresPostBackScript ()
562 requiresPostBackScript = true;
565 [EditorBrowsable (EditorBrowsableState.Never)]
566 public virtual int GetTypeHashCode ()
571 [EditorBrowsable (EditorBrowsableState.Never)]
572 protected virtual void InitOutputCache (int duration,
575 OutputCacheLocation location,
578 HttpCachePolicy cache = _context.Response.Cache;
579 bool set_vary = false;
582 case OutputCacheLocation.Any:
583 cache.SetCacheability (HttpCacheability.Public);
584 cache.SetMaxAge (new TimeSpan (0, 0, duration));
585 cache.SetLastModified (_context.Timestamp);
588 case OutputCacheLocation.Client:
589 cache.SetCacheability (HttpCacheability.Private);
590 cache.SetMaxAge (new TimeSpan (0, 0, duration));
591 cache.SetLastModified (_context.Timestamp);
593 case OutputCacheLocation.Downstream:
594 cache.SetCacheability (HttpCacheability.Public);
595 cache.SetMaxAge (new TimeSpan (0, 0, duration));
596 cache.SetLastModified (_context.Timestamp);
598 case OutputCacheLocation.Server:
599 cache.SetCacheability (HttpCacheability.Server);
602 case OutputCacheLocation.None:
607 if (varyByCustom != null)
608 cache.SetVaryByCustom (varyByCustom);
610 if (varyByParam != null && varyByParam.Length > 0) {
611 string[] prms = varyByParam.Split (';');
612 foreach (string p in prms)
613 cache.VaryByParams [p.Trim ()] = true;
614 cache.VaryByParams.IgnoreParams = false;
616 cache.VaryByParams.IgnoreParams = true;
619 if (varyByHeader != null && varyByHeader.Length > 0) {
620 string[] hdrs = varyByHeader.Split (';');
621 foreach (string h in hdrs)
622 cache.VaryByHeaders [h.Trim ()] = true;
626 cache.Duration = duration;
627 cache.SetExpires (_context.Timestamp.AddSeconds (duration));
633 [EditorBrowsable (EditorBrowsableState.Advanced)]
635 public bool IsClientScriptBlockRegistered (string key)
637 return scriptManager.IsClientScriptBlockRegistered (key);
643 [EditorBrowsable (EditorBrowsableState.Advanced)]
645 public bool IsStartupScriptRegistered (string key)
647 return scriptManager.IsStartupScriptRegistered (key);
650 public string MapPath (string virtualPath)
652 return Request.MapPath (virtualPath);
655 private void RenderPostBackScript (HtmlTextWriter writer, string formUniqueID)
657 writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" value=\"\" />", postEventSourceID);
658 writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" value=\"\" />", postEventArgumentID);
660 writer.WriteLine ("<script language=\"javascript\">");
661 writer.WriteLine ("<!--");
663 if (Request.Browser.Browser == ("Netscape") && Request.Browser.MajorVersion == 4)
664 writer.WriteLine ("\tvar theForm = document.{0};", formUniqueID);
666 writer.WriteLine ("\tvar theForm = document.getElementById ('{0}');", formUniqueID);
668 writer.WriteLine ("\tfunction __doPostBack(eventTarget, eventArgument) {");
669 writer.WriteLine ("\t\ttheForm.{0}.value = eventTarget;", postEventSourceID);
670 writer.WriteLine ("\t\ttheForm.{0}.value = eventArgument;", postEventArgumentID);
671 writer.WriteLine ("\t\ttheForm.submit();");
672 writer.WriteLine ("\t}");
673 writer.WriteLine ("// -->");
674 writer.WriteLine ("</script>");
677 internal void OnFormRender (HtmlTextWriter writer, string formUniqueID)
680 throw new HttpException ("Only 1 HtmlForm is allowed per page.");
682 renderingForm = true;
684 scriptManager.WriteHiddenFields (writer);
685 if (requiresPostBackScript) {
686 RenderPostBackScript (writer, formUniqueID);
687 postBackScriptRendered = true;
690 if (handleViewState) {
691 string vs = GetViewStateString ();
692 writer.Write ("<input type=\"hidden\" name=\"__VIEWSTATE\" ");
693 writer.WriteLine ("value=\"{0}\" />", vs);
696 scriptManager.WriteClientScriptBlocks (writer);
699 internal string GetViewStateString ()
701 if (_savedViewState == null)
703 StringWriter sr = new StringWriter ();
704 LosFormatter fmt = new LosFormatter ();
705 fmt.Serialize (sr, _savedViewState);
706 return sr.GetStringBuilder ().ToString ();
709 internal void OnFormPostRender (HtmlTextWriter writer, string formUniqueID)
711 scriptManager.WriteArrayDeclares (writer);
713 if (!postBackScriptRendered && requiresPostBackScript)
714 RenderPostBackScript (writer, formUniqueID);
716 scriptManager.WriteHiddenFields (writer);
717 scriptManager.WriteClientScriptIncludes (writer);
718 scriptManager.WriteStartupScriptBlocks (writer);
719 renderingForm = false;
720 postBackScriptRendered = false;
723 private void ProcessPostData (NameValueCollection data, bool second)
728 if (_requiresPostBackCopy == null && _requiresPostBack != null)
729 _requiresPostBackCopy = (ArrayList) _requiresPostBack.Clone ();
731 Hashtable used = new Hashtable ();
732 foreach (string id in data.AllKeys){
733 if (id == "__VIEWSTATE" || id == postEventSourceID || id == postEventArgumentID)
737 int dot = real_id.IndexOf ('.');
739 real_id = real_id.Substring (0, dot);
741 if (real_id == null || used.ContainsKey (real_id))
744 used.Add (real_id, real_id);
746 Control ctrl = FindControl (real_id);
748 IPostBackDataHandler pbdh = ctrl as IPostBackDataHandler;
749 IPostBackEventHandler pbeh = ctrl as IPostBackEventHandler;
753 RegisterRequiresRaiseEvent (pbeh);
757 if (pbdh.LoadPostData (real_id, data) == true) {
758 if (requiresPostDataChanged == null)
759 requiresPostDataChanged = new ArrayList ();
760 requiresPostDataChanged.Add (pbdh);
761 if (_requiresPostBackCopy != null)
762 _requiresPostBackCopy.Remove (ctrl.UniqueID);
764 } else if (!second) {
765 if (secondPostData == null)
766 secondPostData = new NameValueCollection ();
767 secondPostData.Add (real_id, data [id]);
771 ArrayList list1 = null;
772 if (_requiresPostBackCopy != null && _requiresPostBackCopy.Count > 0) {
773 string [] handlers = (string []) _requiresPostBackCopy.ToArray (typeof (string));
774 foreach (string id in handlers) {
775 IPostBackDataHandler pbdh = FindControl (id) as IPostBackDataHandler;
777 _requiresPostBackCopy.Remove (id);
778 if (pbdh.LoadPostData (id, data)) {
779 if (requiresPostDataChanged == null)
780 requiresPostDataChanged = new ArrayList ();
782 requiresPostDataChanged.Add (pbdh);
786 list1 = new ArrayList ();
790 _requiresPostBack = list1;
794 [EditorBrowsable (EditorBrowsableState.Never)]
795 public void ProcessRequest (HttpContext context)
798 if (clientTarget != null)
799 Request.ClientTarget = clientTarget;
801 WireupAutomaticEvents ();
802 //-- Control execution lifecycle in the docs
804 // Save culture information because it can be modified in FrameworkInitialize()
805 CultureInfo culture = Thread.CurrentThread.CurrentCulture;
806 CultureInfo uiculture = Thread.CurrentThread.CurrentUICulture;
807 FrameworkInitialize ();
808 context.ErrorPage = _errorPage;
811 InternalProcessRequest ();
814 UnloadRecursive (true);
816 Thread.CurrentThread.CurrentCulture = culture;
817 Thread.CurrentThread.CurrentUICulture = uiculture;
822 internal void ProcessCrossPagePostBack (HttpContext context)
824 isCrossPagePostBack = true;
825 ProcessRequest (context);
829 void InternalProcessRequest ()
831 _requestValueCollection = this.DeterminePostBackMode();
834 if (!IsCrossPagePostBack)
835 LoadPreviousPageReference ();
837 Trace.Write ("aspx.page", "Begin Init");
838 InitRecursive (null);
839 Trace.Write ("aspx.page", "End Init");
842 if (masterPageFile != null) {
843 Controls.Add (Master);
844 Master.FillPlaceHolders ();
848 renderingForm = false;
850 Trace.Write ("aspx.page", "Begin LoadViewState");
851 LoadPageViewState ();
852 Trace.Write ("aspx.page", "End LoadViewState");
853 Trace.Write ("aspx.page", "Begin ProcessPostData");
854 ProcessPostData (_requestValueCollection, false);
855 Trace.Write ("aspx.page", "End ProcessPostData");
859 if (IsCrossPagePostBack)
865 Trace.Write ("aspx.page", "Begin ProcessPostData Second Try");
866 ProcessPostData (secondPostData, true);
867 Trace.Write ("aspx.page", "End ProcessPostData Second Try");
868 Trace.Write ("aspx.page", "Begin Raise ChangedEvents");
869 RaiseChangedEvents ();
870 Trace.Write ("aspx.page", "End Raise ChangedEvents");
871 Trace.Write ("aspx.page", "Begin Raise PostBackEvent");
872 RaisePostBackEvents ();
873 Trace.Write ("aspx.page", "End Raise PostBackEvent");
878 string result = ProcessCallbackData ();
879 HtmlTextWriter callbackOutput = new HtmlTextWriter (_context.Response.Output);
880 callbackOutput.Write (result);
881 callbackOutput.Flush ();
886 Trace.Write ("aspx.page", "Begin PreRender");
887 PreRenderRecursiveInternal ();
888 Trace.Write ("aspx.page", "End PreRender");
890 Trace.Write ("aspx.page", "Begin SaveViewState");
891 SavePageViewState ();
892 Trace.Write ("aspx.page", "End SaveViewState");
895 Trace.Write ("aspx.page", "Begin Render");
896 HtmlTextWriter output = new HtmlTextWriter (_context.Response.Output);
897 RenderControl (output);
898 Trace.Write ("aspx.page", "End Render");
900 RenderTrace (output);
903 private void RenderTrace (HtmlTextWriter output)
905 TraceManager traceManager = HttpRuntime.TraceManager;
907 if (Trace.HaveTrace && !Trace.IsEnabled || !Trace.HaveTrace && !traceManager.Enabled)
912 if (!Trace.HaveTrace && traceManager.Enabled && !traceManager.PageOutput)
915 if (!traceManager.LocalOnly || Context.Request.IsLocal)
916 Trace.Render (output);
919 internal void RaisePostBackEvents ()
921 if (requiresRaiseEvent != null) {
922 RaisePostBackEvent (requiresRaiseEvent, null);
926 NameValueCollection postdata = _requestValueCollection;
927 if (postdata == null)
930 string eventTarget = postdata [postEventSourceID];
931 if (eventTarget == null || eventTarget.Length == 0) {
936 IPostBackEventHandler target = FindControl (eventTarget) as IPostBackEventHandler;
940 string eventArgument = postdata [postEventArgumentID];
941 RaisePostBackEvent (target, eventArgument);
944 internal void RaiseChangedEvents ()
946 if (requiresPostDataChanged == null)
949 foreach (IPostBackDataHandler ipdh in requiresPostDataChanged)
950 ipdh.RaisePostDataChangedEvent ();
952 requiresPostDataChanged = null;
955 [EditorBrowsable (EditorBrowsableState.Advanced)]
956 protected virtual void RaisePostBackEvent (IPostBackEventHandler sourceControl, string eventArgument)
958 sourceControl.RaisePostBackEvent (eventArgument);
964 [EditorBrowsable (EditorBrowsableState.Advanced)]
965 public void RegisterArrayDeclaration (string arrayName, string arrayValue)
967 scriptManager.RegisterArrayDeclaration (arrayName, arrayValue);
973 [EditorBrowsable (EditorBrowsableState.Advanced)]
974 public virtual void RegisterClientScriptBlock (string key, string script)
976 scriptManager.RegisterClientScriptBlock (key, script);
982 [EditorBrowsable (EditorBrowsableState.Advanced)]
983 public virtual void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue)
985 scriptManager.RegisterHiddenField (hiddenFieldName, hiddenFieldInitialValue);
988 [MonoTODO("Used in HtmlForm")]
989 internal void RegisterClientScriptFile (string a, string b, string c)
991 throw new NotImplementedException ();
997 [EditorBrowsable (EditorBrowsableState.Advanced)]
998 public void RegisterOnSubmitStatement (string key, string script)
1000 scriptManager.RegisterOnSubmitStatement (key, script);
1003 [EditorBrowsable (EditorBrowsableState.Advanced)]
1004 public void RegisterRequiresPostBack (Control control)
1006 if (_requiresPostBack == null)
1007 _requiresPostBack = new ArrayList ();
1009 _requiresPostBack.Add (control.UniqueID);
1012 [EditorBrowsable (EditorBrowsableState.Advanced)]
1013 public virtual void RegisterRequiresRaiseEvent (IPostBackEventHandler control)
1015 requiresRaiseEvent = control;
1021 [EditorBrowsable (EditorBrowsableState.Advanced)]
1022 public virtual void RegisterStartupScript (string key, string script)
1024 scriptManager.RegisterStartupScript (key, script);
1027 [EditorBrowsable (EditorBrowsableState.Advanced)]
1028 public void RegisterViewStateHandler ()
1030 handleViewState = true;
1033 [EditorBrowsable (EditorBrowsableState.Advanced)]
1034 protected virtual void SavePageStateToPersistenceMedium (object viewState)
1036 _savedViewState = viewState;
1039 [EditorBrowsable (EditorBrowsableState.Advanced)]
1040 protected virtual object LoadPageStateFromPersistenceMedium ()
1042 NameValueCollection postdata = _requestValueCollection;
1044 if (postdata == null || (view_state = postdata ["__VIEWSTATE"]) == null)
1047 _savedViewState = null;
1048 LosFormatter fmt = new LosFormatter ();
1051 _savedViewState = fmt.Deserialize (view_state);
1052 } catch (Exception e) {
1053 throw new HttpException ("Error restoring page viewstate.\n", e);
1056 return _savedViewState;
1059 internal void LoadPageViewState()
1061 object sState = LoadPageStateFromPersistenceMedium ();
1062 if (sState != null) {
1064 Triplet data = (Triplet) sState;
1065 LoadViewStateRecursive (data.First);
1066 _requiresPostBack = data.Second as ArrayList;
1067 LoadPageControlState (data.Third);
1069 Pair pair = (Pair) sState;
1070 LoadViewStateRecursive (pair.First);
1071 _requiresPostBack = pair.Second as ArrayList;
1076 internal void SavePageViewState ()
1078 if (!handleViewState)
1081 object viewState = SaveViewStateRecursive ();
1082 object reqPostback = (_requiresPostBack != null && _requiresPostBack.Count > 0) ? _requiresPostBack : null;
1085 Triplet triplet = new Triplet ();
1086 triplet.First = viewState;
1087 triplet.Second = reqPostback;
1088 triplet.Third = SavePageControlState ();
1090 if (triplet.First == null && triplet.Second == null && triplet.Third == null)
1093 SavePageStateToPersistenceMedium (triplet);
1095 Pair pair = new Pair ();
1096 pair.First = viewState;
1097 pair.Second = reqPostback;
1099 if (pair.First == null && pair.Second == null)
1102 SavePageStateToPersistenceMedium (pair);
1106 public virtual void Validate ()
1108 ValidateCollection (_validators);
1111 void ValidateCollection (ValidatorCollection validators)
1113 if (validators == null || validators.Count == 0){
1118 bool all_valid = true;
1119 foreach (IValidator v in validators){
1121 if (v.IsValid == false)
1129 [EditorBrowsable (EditorBrowsableState.Advanced)]
1130 public virtual void VerifyRenderingInServerForm (Control control)
1133 throw new HttpException ("Control '" + control.ClientID + " " + control.GetType () +
1134 "' must be rendered within a HtmlForm");
1144 ClientScriptManager ClientScript {
1145 get { return scriptManager; }
1149 public string GetWebResourceUrl(Type type, string resourceName)
1152 throw new ArgumentNullException ("type");
1154 if (resourceName == null || resourceName.Length == 0)
1155 throw new ArgumentNullException ("type");
1157 return System.Web.Handlers.AssemblyResourceLoader.GetResourceUrl (type, resourceName);
1162 internal void PushDataItemContext (object o)
1164 if (dataItemCtx == null)
1165 dataItemCtx = new Stack ();
1167 dataItemCtx.Push (o);
1170 internal void PopDataItemContext ()
1172 if (dataItemCtx == null)
1173 throw new InvalidOperationException ();
1178 internal object CurrentDataItem {
1180 if (dataItemCtx == null)
1181 throw new InvalidOperationException ("No data item");
1183 return dataItemCtx.Peek ();
1187 protected object Eval (string expression)
1189 return DataBinder.Eval (CurrentDataItem, expression);
1192 protected object Eval (string expression, string format)
1194 return DataBinder.Eval (CurrentDataItem, expression, format);
1197 protected object XPath (string xpathexpression)
1199 return XPathBinder.Eval (CurrentDataItem, xpathexpression);
1202 protected object XPath (string xpathexpression, string format)
1204 return XPathBinder.Eval (CurrentDataItem, xpathexpression, format);
1207 protected IEnumerable XPathSelect (string xpathexpression)
1209 return XPathBinder.Select (CurrentDataItem, xpathexpression);
1212 [EditorBrowsable (EditorBrowsableState.Advanced)]
1213 public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context)
1215 return GetCallbackEventReference (control, argument, clientCallback, context, null);
1218 [EditorBrowsable (EditorBrowsableState.Advanced)]
1219 public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context, string clientErrorCallback)
1221 if (!ClientScript.IsClientScriptIncludeRegistered (typeof(Page), "callback"))
1222 ClientScript.RegisterClientScriptInclude (typeof(Page), "callback", GetWebResourceUrl (typeof(Page), "callback.js"));
1224 return string.Format ("WebForm_DoCallback ('{0}', {1}, {2}, {3}, {4})", control.UniqueID, argument, clientCallback, context, clientErrorCallback);
1227 [EditorBrowsable (EditorBrowsableState.Advanced)]
1228 public string GetPostBackEventReference (PostBackOptions options)
1230 if (!ClientScript.IsClientScriptIncludeRegistered (typeof(Page), "webform")) {
1231 ClientScript.RegisterClientScriptInclude (typeof(Page), "webform", GetWebResourceUrl (typeof(Page), "webform.js"));
1234 if (options.ActionUrl != null)
1235 ClientScript.RegisterHiddenField (previousPageID, _context.Request.FilePath);
1237 if (options.ClientSubmit || options.ActionUrl != null)
1238 RequiresPostBackScript ();
1240 return String.Format ("{0}WebForm_DoPostback({1},{2},{3},{4},{5},{6},{7},{8})",
1241 options.RequiresJavaScriptProtocol ? "javascript:" : "",
1242 ClientScriptManager.GetScriptLiteral (options.TargetControl.UniqueID),
1243 ClientScriptManager.GetScriptLiteral (options.Argument),
1244 ClientScriptManager.GetScriptLiteral (options.ActionUrl),
1245 ClientScriptManager.GetScriptLiteral (options.AutoPostBack),
1246 ClientScriptManager.GetScriptLiteral (options.PerformValidation),
1247 ClientScriptManager.GetScriptLiteral (options.TrackFocus),
1248 ClientScriptManager.GetScriptLiteral (options.ClientSubmit),
1249 ClientScriptManager.GetScriptLiteral (options.ValidationGroup)
1253 [BrowsableAttribute (false)]
1254 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1255 public Page PreviousPage {
1256 get { return previousPage; }
1260 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1261 [BrowsableAttribute (false)]
1262 public bool IsCallback {
1263 get { return _requestValueCollection != null && _requestValueCollection [callbackArgumentID] != null; }
1266 [BrowsableAttribute (false)]
1267 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1268 public bool IsCrossPagePostBack {
1269 get { return _requestValueCollection != null && isCrossPagePostBack; }
1272 string ProcessCallbackData ()
1274 string callbackTarget = _requestValueCollection [callbackSourceID];
1275 if (callbackTarget == null || callbackTarget.Length == 0)
1276 throw new HttpException ("Callback target not provided.");
1278 ICallbackEventHandler target = FindControl (callbackTarget) as ICallbackEventHandler;
1280 throw new HttpException (string.Format ("Invalid callback target '{0}'.", callbackTarget));
1282 string callbackArgument = _requestValueCollection [callbackArgumentID];
1283 return target.RaiseCallbackEvent (callbackArgument);
1286 [BrowsableAttribute (false)]
1287 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1288 public IPageHeader Header {
1289 get { return htmlHeader; }
1292 internal void SetHeader (IPageHeader header)
1294 htmlHeader = header;
1297 [DefaultValueAttribute ("")]
1298 public string MasterPageFile {
1299 get { return masterPageFile; }
1300 set { masterPageFile = value; masterPage = null; }
1303 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1304 [BrowsableAttribute (false)]
1305 public MasterPage Master {
1307 if (masterPage == null)
1308 masterPage = MasterPageParser.GetCompiledMasterInstance (masterPageFile, Server.MapPath (masterPageFile), Context);
1313 [EditorBrowsable (EditorBrowsableState.Advanced)]
1314 public void RegisterRequiresControlState (Control control)
1316 if (requireStateControls == null) requireStateControls = new ArrayList ();
1317 requireStateControls.Add (control);
1320 public ValidatorCollection GetValidators (string validationGroup)
1322 if (validationGroup == null || validationGroup == "")
1325 if (_validatorsByGroup == null) _validatorsByGroup = new Hashtable ();
1326 ValidatorCollection col = _validatorsByGroup [validationGroup] as ValidatorCollection;
1328 col = new ValidatorCollection ();
1329 _validatorsByGroup [validationGroup] = col;
1334 public virtual void Validate (string validationGroup)
1336 if (validationGroup == null || validationGroup == "")
1337 ValidateCollection (_validators);
1339 if (_validatorsByGroup != null) {
1340 ValidateCollection (_validatorsByGroup [validationGroup] as ValidatorCollection);
1347 object SavePageControlState ()
1349 if (requireStateControls == null) return null;
1350 object[] state = new object [requireStateControls.Count];
1352 bool allNull = true;
1353 for (int n=0; n<state.Length; n++) {
1354 state [n] = ((Control) requireStateControls [n]).SaveControlState ();
1355 if (state [n] != null) allNull = false;
1357 if (allNull) return null;
1361 void LoadPageControlState (object data)
1363 if (requireStateControls == null) return;
1365 object[] state = (object[]) data;
1366 int max = Math.Min (requireStateControls.Count, state != null ? state.Length : requireStateControls.Count);
1367 for (int n=0; n < max; n++) {
1368 Control ctl = (Control) requireStateControls [n];
1369 ctl.LoadControlState (state != null ? state [n] : null);
1373 void LoadPreviousPageReference ()
1375 if (_requestValueCollection != null) {
1376 string prevPage = _requestValueCollection [previousPageID];
1377 if (prevPage != null) {
1378 previousPage = (Page) PageParser.GetCompiledPageInstance (prevPage, Server.MapPath (prevPage), Context);
1379 previousPage.ProcessCrossPagePostBack (_context);
1381 previousPage = _context.LastPage;
1384 _context.LastPage = this;