// // System.Web.UI.Page.cs // // Authors: // Duncan Mak (duncan@ximian.com) // Gonzalo Paniagua (gonzalo@ximian.com) // Andreas Nahr (ClassDevelopment@A-SoftTech.com) // // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com) // (c) 2003 Novell, Inc. (http://www.novell.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Globalization; using System.IO; using System.Security.Principal; using System.Text; using System.Threading; using System.Web; using System.Web.Caching; using System.Web.SessionState; using System.Web.Util; #if NET_2_0 using System.Web.UI.HtmlControls; #endif namespace System.Web.UI { #if !NET_2_0 [RootDesignerSerializer ("Microsoft.VSDesigner.WebForms.RootCodeDomSerializer, " + Consts.AssemblyMicrosoft_VSDesigner, "System.ComponentModel.Design.Serialization.CodeDomSerializer, " + Consts.AssemblySystem_Design, true)] #endif [DefaultEvent ("Load"), DesignerCategory ("ASPXCodeBehind")] [ToolboxItem (false)] [Designer ("System.Web.UI.Design.ControlDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))] public class Page : TemplateControl, IHttpHandler { private bool _viewState = true; private bool _viewStateMac; private string _errorPage; private bool _isValid; private bool _smartNavigation; private int _transactionMode; private HttpContext _context; private ValidatorCollection _validators; private bool renderingForm; private object _savedViewState; private ArrayList _requiresPostBack; private ArrayList _requiresPostBackCopy; private ArrayList requiresPostDataChanged; private IPostBackEventHandler requiresRaiseEvent; private NameValueCollection secondPostData; private bool requiresPostBackScript; private bool postBackScriptRendered; bool handleViewState; string viewStateUserKey; NameValueCollection _requestValueCollection; string clientTarget; ClientScriptManager scriptManager; [EditorBrowsable (EditorBrowsableState.Never)] protected const string postEventArgumentID = "__EVENTARGUMENT"; [EditorBrowsable (EditorBrowsableState.Never)] protected const string postEventSourceID = "__EVENTTARGET"; #if NET_2_0 internal const string CallbackArgumentID = "__CALLBACKARGUMENT"; internal const string CallbackSourceID = "__CALLBACKTARGET"; internal const string PreviousPageID = "__PREVIOUSPAGE"; IPageHeader htmlHeader; MasterPage masterPage; string masterPageFile; Page previousPage; bool isCrossPagePostBack; ArrayList requireStateControls; Hashtable _validatorsByGroup; HtmlForm _form; #endif #region Constructor public Page () { scriptManager = new ClientScriptManager (this); Page = this; } #endregion #region Properties [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpApplicationState Application { get { return _context.Application; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 public bool AspCompatMode { get { return false; } set { throw new NotImplementedException (); } } #else protected bool AspCompatMode { set { throw new NotImplementedException (); } } #endif [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool Buffer { get { return Response.BufferOutput; } set { Response.BufferOutput = value; } } #else protected bool Buffer { set { Response.BufferOutput = value; } } #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public Cache Cache { get { return _context.Cache; } } #if NET_2_0 [EditorBrowsableAttribute (EditorBrowsableState.Advanced)] #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false), DefaultValue ("")] [WebSysDescription ("Value do override the automatic browser detection and force the page to use the specified browser.")] public string ClientTarget { get { return (clientTarget == null) ? "" : clientTarget; } set { clientTarget = value; if (value == "") clientTarget = null; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public int CodePage { get { return Response.ContentEncoding.CodePage; } set { Response.ContentEncoding = Encoding.GetEncoding (value); } } #else protected int CodePage { set { Response.ContentEncoding = Encoding.GetEncoding (value); } } #endif [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string ContentType { get { return Response.ContentType; } set { Response.ContentType = value; } } #else protected string ContentType { set { Response.ContentType = value; } } #endif protected override HttpContext Context { get { if (_context == null) return HttpContext.Current; return _context; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string Culture { get { return Thread.CurrentThread.CurrentCulture.Name; } set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); } } #else protected string Culture { set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); } } #endif [Browsable (false)] public override bool EnableViewState { get { return _viewState; } set { _viewState = value; } } #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] #endif [EditorBrowsable (EditorBrowsableState.Never)] protected bool EnableViewStateMac { get { return _viewStateMac; } set { _viewStateMac = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false), DefaultValue ("")] [WebSysDescription ("The URL of a page used for error redirection.")] public string ErrorPage { get { return _errorPage; } set { _errorPage = value; if (_context != null) _context.ErrorPage = value; } } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Never)] protected ArrayList FileDependencies { set { if (Response != null) Response.AddFileDependencies (value); } } [Browsable (false)] public override string ID { get { return base.ID; } set { base.ID = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public bool IsPostBack { get { return _requestValueCollection != null; } } [EditorBrowsable (EditorBrowsableState.Never), Browsable (false)] public bool IsReusable { get { return false; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public bool IsValid { get { return _isValid; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public int LCID { get { return Thread.CurrentThread.CurrentCulture.LCID; } set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); } } #else protected int LCID { set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); } } #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpRequest Request { get { return _context.Request; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpResponse Response { get { return _context.Response; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string ResponseEncoding { get { return Response.ContentEncoding.WebName; } set { Response.ContentEncoding = Encoding.GetEncoding (value); } } #else protected string ResponseEncoding { set { Response.ContentEncoding = Encoding.GetEncoding (value); } } #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpServerUtility Server { get { return Context.Server; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public virtual HttpSessionState Session { get { if (_context.Session == null) throw new HttpException ("Session state can only be used " + "when enableSessionState is set to true, either " + "in a configuration file or in the Page directive."); return _context.Session; } } #if NET_2_0 [FilterableAttribute (false)] #endif [Browsable (false)] public bool SmartNavigation { get { return _smartNavigation; } set { _smartNavigation = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public TraceContext Trace { get { return Context.Trace; } } [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool TraceEnabled { get { return Trace.IsEnabled; } set { Trace.IsEnabled = value; } } #else protected bool TraceEnabled { set { Trace.IsEnabled = value; } } #endif [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public TraceMode TraceModeValue { get { return Trace.TraceMode; } set { Trace.TraceMode = value; } } #else protected TraceMode TraceModeValue { set { Trace.TraceMode = value; } } #endif [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 public int TransactionMode { get { return _transactionMode; } set { _transactionMode = value; } } #else protected int TransactionMode { set { _transactionMode = value; } } #endif [EditorBrowsable (EditorBrowsableState.Never)] #if NET_2_0 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string UICulture { get { return Thread.CurrentThread.CurrentUICulture.Name; } set { Thread.CurrentThread.CurrentUICulture = new CultureInfo (value); } } #else protected string UICulture { set { Thread.CurrentThread.CurrentUICulture = new CultureInfo (value); } } #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public IPrincipal User { get { return _context.User; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public ValidatorCollection Validators { get { if (_validators == null) _validators = new ValidatorCollection (); return _validators; } } [MonoTODO ("Use this when encrypting/decrypting ViewState")] [Browsable (false)] public string ViewStateUserKey { get { return viewStateUserKey; } set { viewStateUserKey = value; } } [Browsable (false)] public override bool Visible { get { return base.Visible; } set { base.Visible = value; } } #endregion #region Methods [EditorBrowsable (EditorBrowsableState.Never)] protected IAsyncResult AspCompatBeginProcessRequest (HttpContext context, AsyncCallback cb, object extraData) { throw new NotImplementedException (); } [EditorBrowsable (EditorBrowsableState.Never)] protected void AspCompatEndProcessRequest (IAsyncResult result) { throw new NotImplementedException (); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual HtmlTextWriter CreateHtmlTextWriter (TextWriter tw) { return new HtmlTextWriter (tw); } [EditorBrowsable (EditorBrowsableState.Never)] public void DesignerInitialize () { InitRecursive (null); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual NameValueCollection DeterminePostBackMode () { if (_context == null) return null; HttpRequest req = _context.Request; if (req == null) return null; NameValueCollection coll = null; if (0 == String.Compare (Request.HttpMethod, "POST", true)) coll = req.Form; else coll = req.QueryString; if (coll == null || coll ["__VIEWSTATE"] == null) return null; return coll; } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackClientEvent (Control control, string argument) { return scriptManager.GetPostBackClientEvent (control, argument); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackClientHyperlink (Control control, string argument) { return scriptManager.GetPostBackClientHyperlink (control, argument); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackEventReference (Control control) { return scriptManager.GetPostBackEventReference (control); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackEventReference (Control control, string argument) { return scriptManager.GetPostBackEventReference (control, argument); } internal void RequiresPostBackScript () { requiresPostBackScript = true; } [EditorBrowsable (EditorBrowsableState.Never)] public virtual int GetTypeHashCode () { return 0; } [EditorBrowsable (EditorBrowsableState.Never)] protected virtual void InitOutputCache (int duration, string varyByHeader, string varyByCustom, OutputCacheLocation location, string varyByParam) { HttpCachePolicy cache = _context.Response.Cache; bool set_vary = false; switch (location) { case OutputCacheLocation.Any: cache.SetCacheability (HttpCacheability.Public); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (_context.Timestamp); set_vary = true; break; case OutputCacheLocation.Client: cache.SetCacheability (HttpCacheability.Private); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (_context.Timestamp); break; case OutputCacheLocation.Downstream: cache.SetCacheability (HttpCacheability.Public); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (_context.Timestamp); break; case OutputCacheLocation.Server: cache.SetCacheability (HttpCacheability.Server); set_vary = true; break; case OutputCacheLocation.None: break; } if (set_vary) { if (varyByCustom != null) cache.SetVaryByCustom (varyByCustom); if (varyByParam != null && varyByParam.Length > 0) { string[] prms = varyByParam.Split (';'); foreach (string p in prms) cache.VaryByParams [p.Trim ()] = true; cache.VaryByParams.IgnoreParams = false; } else { cache.VaryByParams.IgnoreParams = true; } if (varyByHeader != null && varyByHeader.Length > 0) { string[] hdrs = varyByHeader.Split (';'); foreach (string h in hdrs) cache.VaryByHeaders [h.Trim ()] = true; } } cache.Duration = duration; cache.SetExpires (_context.Timestamp.AddSeconds (duration)); } #if NET_2_0 [Obsolete] #else [EditorBrowsable (EditorBrowsableState.Advanced)] #endif public bool IsClientScriptBlockRegistered (string key) { return scriptManager.IsClientScriptBlockRegistered (key); } #if NET_2_0 [Obsolete] #else [EditorBrowsable (EditorBrowsableState.Advanced)] #endif public bool IsStartupScriptRegistered (string key) { return scriptManager.IsStartupScriptRegistered (key); } public string MapPath (string virtualPath) { return Request.MapPath (virtualPath); } private void RenderPostBackScript (HtmlTextWriter writer, string formUniqueID) { writer.WriteLine ("", postEventSourceID); writer.WriteLine ("", postEventArgumentID); writer.WriteLine (); writer.WriteLine (""); } internal void OnFormRender (HtmlTextWriter writer, string formUniqueID) { if (renderingForm) throw new HttpException ("Only 1 HtmlForm is allowed per page."); renderingForm = true; writer.WriteLine (); scriptManager.WriteHiddenFields (writer); if (requiresPostBackScript) { RenderPostBackScript (writer, formUniqueID); postBackScriptRendered = true; } if (handleViewState) { string vs = GetViewStateString (); writer.Write ("", vs); } scriptManager.WriteClientScriptBlocks (writer); } internal string GetViewStateString () { if (_savedViewState == null) return null; StringWriter sr = new StringWriter (); LosFormatter fmt = new LosFormatter (); fmt.Serialize (sr, _savedViewState); return sr.GetStringBuilder ().ToString (); } internal void OnFormPostRender (HtmlTextWriter writer, string formUniqueID) { scriptManager.WriteArrayDeclares (writer); if (!postBackScriptRendered && requiresPostBackScript) RenderPostBackScript (writer, formUniqueID); scriptManager.WriteHiddenFields (writer); scriptManager.WriteClientScriptIncludes (writer); scriptManager.WriteStartupScriptBlocks (writer); renderingForm = false; postBackScriptRendered = false; } private void ProcessPostData (NameValueCollection data, bool second) { if (data == null) return; if (_requiresPostBackCopy == null && _requiresPostBack != null) _requiresPostBackCopy = (ArrayList) _requiresPostBack.Clone (); Hashtable used = new Hashtable (); foreach (string id in data.AllKeys){ if (id == "__VIEWSTATE" || id == postEventSourceID || id == postEventArgumentID) continue; string real_id = id; int dot = real_id.IndexOf ('.'); if (dot >= 1) real_id = real_id.Substring (0, dot); if (real_id == null || used.ContainsKey (real_id)) continue; used.Add (real_id, real_id); Control ctrl = FindControl (real_id); if (ctrl != null){ IPostBackDataHandler pbdh = ctrl as IPostBackDataHandler; IPostBackEventHandler pbeh = ctrl as IPostBackEventHandler; if (pbdh == null) { if (pbeh != null) RegisterRequiresRaiseEvent (pbeh); continue; } if (pbdh.LoadPostData (real_id, data) == true) { if (requiresPostDataChanged == null) requiresPostDataChanged = new ArrayList (); requiresPostDataChanged.Add (pbdh); if (_requiresPostBackCopy != null) _requiresPostBackCopy.Remove (ctrl.UniqueID); } } else if (!second) { if (secondPostData == null) secondPostData = new NameValueCollection (); secondPostData.Add (real_id, data [id]); } } ArrayList list1 = null; if (_requiresPostBackCopy != null && _requiresPostBackCopy.Count > 0) { string [] handlers = (string []) _requiresPostBackCopy.ToArray (typeof (string)); foreach (string id in handlers) { IPostBackDataHandler pbdh = FindControl (id) as IPostBackDataHandler; if (pbdh != null) { _requiresPostBackCopy.Remove (id); if (pbdh.LoadPostData (id, data)) { if (requiresPostDataChanged == null) requiresPostDataChanged = new ArrayList (); requiresPostDataChanged.Add (pbdh); } } else if (second) { if (list1 == null) list1 = new ArrayList (); list1.Add (id); } } _requiresPostBack = list1; } } [EditorBrowsable (EditorBrowsableState.Never)] public void ProcessRequest (HttpContext context) { _context = context; if (clientTarget != null) Request.ClientTarget = clientTarget; WireupAutomaticEvents (); //-- Control execution lifecycle in the docs // Save culture information because it can be modified in FrameworkInitialize() CultureInfo culture = Thread.CurrentThread.CurrentCulture; CultureInfo uiculture = Thread.CurrentThread.CurrentUICulture; FrameworkInitialize (); context.ErrorPage = _errorPage; try { InternalProcessRequest (); } finally { try { UnloadRecursive (true); } catch {} Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = uiculture; } } #if NET_2_0 internal void ProcessCrossPagePostBack (HttpContext context) { isCrossPagePostBack = true; ProcessRequest (context); } #endif void InternalProcessRequest () { _requestValueCollection = this.DeterminePostBackMode(); #if NET_2_0 if (!IsCrossPagePostBack) LoadPreviousPageReference (); OnPreInit (EventArgs.Empty); #endif Trace.Write ("aspx.page", "Begin Init"); InitRecursive (null); Trace.Write ("aspx.page", "End Init"); #if NET_2_0 OnInitComplete (EventArgs.Empty); if (masterPageFile != null) { Controls.Add (Master); Master.FillPlaceHolders (); } #endif renderingForm = false; if (IsPostBack) { Trace.Write ("aspx.page", "Begin LoadViewState"); LoadPageViewState (); Trace.Write ("aspx.page", "End LoadViewState"); Trace.Write ("aspx.page", "Begin ProcessPostData"); ProcessPostData (_requestValueCollection, false); Trace.Write ("aspx.page", "End ProcessPostData"); } #if NET_2_0 if (IsCrossPagePostBack) return; OnPreLoad (EventArgs.Empty); #endif LoadRecursive (); if (IsPostBack) { Trace.Write ("aspx.page", "Begin ProcessPostData Second Try"); ProcessPostData (secondPostData, true); Trace.Write ("aspx.page", "End ProcessPostData Second Try"); Trace.Write ("aspx.page", "Begin Raise ChangedEvents"); RaiseChangedEvents (); Trace.Write ("aspx.page", "End Raise ChangedEvents"); Trace.Write ("aspx.page", "Begin Raise PostBackEvent"); RaisePostBackEvents (); Trace.Write ("aspx.page", "End Raise PostBackEvent"); } #if NET_2_0 OnLoadComplete (EventArgs.Empty); if (IsCallback) { string result = ProcessCallbackData (); HtmlTextWriter callbackOutput = new HtmlTextWriter (_context.Response.Output); callbackOutput.Write (result); callbackOutput.Flush (); return; } #endif Trace.Write ("aspx.page", "Begin PreRender"); PreRenderRecursiveInternal (); Trace.Write ("aspx.page", "End PreRender"); #if NET_2_0 OnPreRenderComplete (EventArgs.Empty); #endif Trace.Write ("aspx.page", "Begin SaveViewState"); SavePageViewState (); Trace.Write ("aspx.page", "End SaveViewState"); #if NET_2_0 OnSaveStateComplete (EventArgs.Empty); #endif //-- Trace.Write ("aspx.page", "Begin Render"); HtmlTextWriter output = new HtmlTextWriter (_context.Response.Output); RenderControl (output); Trace.Write ("aspx.page", "End Render"); RenderTrace (output); } private void RenderTrace (HtmlTextWriter output) { TraceManager traceManager = HttpRuntime.TraceManager; if (Trace.HaveTrace && !Trace.IsEnabled || !Trace.HaveTrace && !traceManager.Enabled) return; Trace.SaveData (); if (!Trace.HaveTrace && traceManager.Enabled && !traceManager.PageOutput) return; if (!traceManager.LocalOnly || Context.Request.IsLocal) Trace.Render (output); } internal void RaisePostBackEvents () { if (requiresRaiseEvent != null) { RaisePostBackEvent (requiresRaiseEvent, null); return; } NameValueCollection postdata = _requestValueCollection; if (postdata == null) return; string eventTarget = postdata [postEventSourceID]; if (eventTarget == null || eventTarget.Length == 0) { Validate (); return; } IPostBackEventHandler target = FindControl (eventTarget) as IPostBackEventHandler; if (target == null) return; string eventArgument = postdata [postEventArgumentID]; RaisePostBackEvent (target, eventArgument); } internal void RaiseChangedEvents () { if (requiresPostDataChanged == null) return; foreach (IPostBackDataHandler ipdh in requiresPostDataChanged) ipdh.RaisePostDataChangedEvent (); requiresPostDataChanged = null; } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual void RaisePostBackEvent (IPostBackEventHandler sourceControl, string eventArgument) { sourceControl.RaisePostBackEvent (eventArgument); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterArrayDeclaration (string arrayName, string arrayValue) { scriptManager.RegisterArrayDeclaration (arrayName, arrayValue); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterClientScriptBlock (string key, string script) { scriptManager.RegisterClientScriptBlock (key, script); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue) { scriptManager.RegisterHiddenField (hiddenFieldName, hiddenFieldInitialValue); } [MonoTODO("Used in HtmlForm")] internal void RegisterClientScriptFile (string a, string b, string c) { throw new NotImplementedException (); } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterOnSubmitStatement (string key, string script) { scriptManager.RegisterOnSubmitStatement (key, script); } [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterRequiresPostBack (Control control) { if (_requiresPostBack == null) _requiresPostBack = new ArrayList (); _requiresPostBack.Add (control.UniqueID); } [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterRequiresRaiseEvent (IPostBackEventHandler control) { requiresRaiseEvent = control; } #if NET_2_0 [Obsolete] #endif [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterStartupScript (string key, string script) { scriptManager.RegisterStartupScript (key, script); } [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterViewStateHandler () { handleViewState = true; } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual void SavePageStateToPersistenceMedium (object viewState) { _savedViewState = viewState; } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual object LoadPageStateFromPersistenceMedium () { NameValueCollection postdata = _requestValueCollection; string view_state; if (postdata == null || (view_state = postdata ["__VIEWSTATE"]) == null) return null; _savedViewState = null; LosFormatter fmt = new LosFormatter (); try { _savedViewState = fmt.Deserialize (view_state); } catch (Exception e) { throw new HttpException ("Error restoring page viewstate.\n", e); } return _savedViewState; } internal void LoadPageViewState() { object sState = LoadPageStateFromPersistenceMedium (); if (sState != null) { #if NET_2_0 Triplet data = (Triplet) sState; LoadPageControlState (data.Third); LoadViewStateRecursive (data.First); _requiresPostBack = data.Second as ArrayList; #else Pair pair = (Pair) sState; LoadViewStateRecursive (pair.First); _requiresPostBack = pair.Second as ArrayList; #endif } } internal void SavePageViewState () { if (!handleViewState) return; #if NET_2_0 object controlState = SavePageControlState (); #endif object viewState = SaveViewStateRecursive (); object reqPostback = (_requiresPostBack != null && _requiresPostBack.Count > 0) ? _requiresPostBack : null; #if NET_2_0 Triplet triplet = new Triplet (); triplet.First = viewState; triplet.Second = reqPostback; triplet.Third = controlState; if (triplet.First == null && triplet.Second == null && triplet.Third == null) triplet = null; SavePageStateToPersistenceMedium (triplet); #else Pair pair = new Pair (); pair.First = viewState; pair.Second = reqPostback; if (pair.First == null && pair.Second == null) pair = null; SavePageStateToPersistenceMedium (pair); #endif } public virtual void Validate () { ValidateCollection (_validators); } void ValidateCollection (ValidatorCollection validators) { if (validators == null || validators.Count == 0){ _isValid = true; return; } bool all_valid = true; foreach (IValidator v in validators){ v.Validate (); if (v.IsValid == false) all_valid = false; } if (all_valid) _isValid = true; } [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void VerifyRenderingInServerForm (Control control) { if (!renderingForm) throw new HttpException ("Control '" + control.ClientID + " " + control.GetType () + "' must be rendered within a HtmlForm"); } #endregion #if NET_2_0 public #else internal #endif ClientScriptManager ClientScript { get { return scriptManager; } } #if NET_2_0 static readonly object InitCompleteEvent = new object (); static readonly object LoadCompleteEvent = new object (); static readonly object PreInitEvent = new object (); static readonly object PreLoadEvent = new object (); static readonly object PreRenderCompleteEvent = new object (); static readonly object SaveStateCompleteEvent = new object (); public event EventHandler InitComplete { add { Events.AddHandler (InitCompleteEvent, value); } remove { Events.RemoveHandler (InitCompleteEvent, value); } } public event EventHandler LoadComplete { add { Events.AddHandler (LoadCompleteEvent, value); } remove { Events.RemoveHandler (LoadCompleteEvent, value); } } public event EventHandler PreInit { add { Events.AddHandler (PreInitEvent, value); } remove { Events.RemoveHandler (PreInitEvent, value); } } public event EventHandler PreLoad { add { Events.AddHandler (PreLoadEvent, value); } remove { Events.RemoveHandler (PreLoadEvent, value); } } public event EventHandler PreRenderComplete { add { Events.AddHandler (PreRenderCompleteEvent, value); } remove { Events.RemoveHandler (PreRenderCompleteEvent, value); } } public event EventHandler SaveStateComplete { add { Events.AddHandler (SaveStateCompleteEvent, value); } remove { Events.RemoveHandler (SaveStateCompleteEvent, value); } } protected virtual void OnInitComplete (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [InitCompleteEvent]); if (eh != null) eh (this, e); } } protected virtual void OnLoadComplete (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [LoadCompleteEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreInit (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [PreInitEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreLoad (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [PreLoadEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreRenderComplete (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [PreRenderCompleteEvent]); if (eh != null) eh (this, e); } } protected virtual void OnSaveStateComplete (EventArgs e) { if (Events != null) { EventHandler eh = (EventHandler) (Events [SaveStateCompleteEvent]); if (eh != null) eh (this, e); } } public HtmlForm Form { get { return _form; } } internal void RegisterForm (HtmlForm form) { _form = form; } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public Page PreviousPage { get { return previousPage; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool IsCallback { get { return _requestValueCollection != null && _requestValueCollection [CallbackArgumentID] != null; } } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public bool IsCrossPagePostBack { get { return _requestValueCollection != null && isCrossPagePostBack; } } string ProcessCallbackData () { string callbackTarget = _requestValueCollection [CallbackSourceID]; if (callbackTarget == null || callbackTarget.Length == 0) throw new HttpException ("Callback target not provided."); ICallbackEventHandler target = FindControl (callbackTarget) as ICallbackEventHandler; if (target == null) throw new HttpException (string.Format ("Invalid callback target '{0}'.", callbackTarget)); string callbackArgument = _requestValueCollection [CallbackArgumentID]; return target.RaiseCallbackEvent (callbackArgument); } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public IPageHeader Header { get { return htmlHeader; } } internal void SetHeader (IPageHeader header) { htmlHeader = header; } [DefaultValueAttribute ("")] public string MasterPageFile { get { return masterPageFile; } set { masterPageFile = value; masterPage = null; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public MasterPage Master { get { if (masterPage == null) masterPage = MasterPageParser.GetCompiledMasterInstance (masterPageFile, Server.MapPath (masterPageFile), Context); return masterPage; } } [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterRequiresControlState (Control control) { if (requireStateControls == null) requireStateControls = new ArrayList (); requireStateControls.Add (control); } public bool RequiresControlState (Control control) { if (requireStateControls == null) return false; return requireStateControls.Contains (control); } [EditorBrowsable (EditorBrowsableState.Advanced)] public void UnregisterRequiresControlState (Control control) { if (requireStateControls != null) requireStateControls.Remove (control); } public ValidatorCollection GetValidators (string validationGroup) { if (validationGroup == null || validationGroup == "") return Validators; if (_validatorsByGroup == null) _validatorsByGroup = new Hashtable (); ValidatorCollection col = _validatorsByGroup [validationGroup] as ValidatorCollection; if (col == null) { col = new ValidatorCollection (); _validatorsByGroup [validationGroup] = col; } return col; } public virtual void Validate (string validationGroup) { if (validationGroup == null || validationGroup == "") ValidateCollection (_validators); else { if (_validatorsByGroup != null) { ValidateCollection (_validatorsByGroup [validationGroup] as ValidatorCollection); } else { _isValid = true; } } } object SavePageControlState () { if (requireStateControls == null) return null; object[] state = new object [requireStateControls.Count]; bool allNull = true; for (int n=0; n