// // System.Web.UI.Page.cs // // Authors: // Duncan Mak (duncan@ximian.com) // Gonzalo Paniagua (gonzalo@ximian.com) // Andreas Nahr (ClassDevelopment@A-SoftTech.com) // Marek Habersack (mhabersack@novell.com) // // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com) // Copyright (C) 2003-2010 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.Generic; 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.Permissions; using System.Security.Principal; using System.Text; using System.Threading; using System.Web; using System.Web.Caching; using System.Web.Compilation; using System.Web.Configuration; using System.Web.Hosting; using System.Web.SessionState; using System.Web.Util; using System.Web.UI.Adapters; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Reflection; #if NET_4_0 using System.Web.Routing; #endif namespace System.Web.UI { // CAS [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [DefaultEvent ("Load"), DesignerCategory ("ASPXCodeBehind")] [ToolboxItem (false)] [Designer ("Microsoft.VisualStudio.Web.WebForms.WebFormDesigner, " + Consts.AssemblyMicrosoft_VisualStudio_Web, typeof (IRootDesigner))] [DesignerSerializer ("Microsoft.VisualStudio.Web.WebForms.WebFormCodeDomSerializer, " + Consts.AssemblyMicrosoft_VisualStudio_Web, "System.ComponentModel.Design.Serialization.TypeCodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public partial class Page : TemplateControl, IHttpHandler { // static string machineKeyConfigPath = "system.web/machineKey"; bool _eventValidation = true; object [] _savedControlState; bool _doLoadPreviousPage; string _focusedControlID; bool _hasEnabledControlArray; bool _viewState; bool _viewStateMac; string _errorPage; bool is_validated; bool _smartNavigation; int _transactionMode; ValidatorCollection _validators; bool renderingForm; string _savedViewState; List _requiresPostBack; List _requiresPostBackCopy; List requiresPostDataChanged; IPostBackEventHandler requiresRaiseEvent; IPostBackEventHandler formPostedRequiresRaiseEvent; NameValueCollection secondPostData; bool requiresPostBackScript; bool postBackScriptRendered; bool requiresFormScriptDeclaration; bool formScriptDeclarationRendered; bool handleViewState; string viewStateUserKey; NameValueCollection _requestValueCollection; string clientTarget; ClientScriptManager scriptManager; bool allow_load; // true when the Form collection belongs to this page (GetTypeHashCode) PageStatePersister page_state_persister; CultureInfo _appCulture; CultureInfo _appUICulture; // The initial context HttpContext _context; // cached from the initial context HttpApplicationState _application; HttpResponse _response; HttpRequest _request; Cache _cache; HttpSessionState _session; [EditorBrowsable (EditorBrowsableState.Never)] public const string postEventArgumentID = "__EVENTARGUMENT"; [EditorBrowsable (EditorBrowsableState.Never)] public const string postEventSourceID = "__EVENTTARGET"; const string ScrollPositionXID = "__SCROLLPOSITIONX"; const string ScrollPositionYID = "__SCROLLPOSITIONY"; const string EnabledControlArrayID = "__enabledControlArray"; internal const string LastFocusID = "__LASTFOCUS"; internal const string CallbackArgumentID = "__CALLBACKPARAM"; internal const string CallbackSourceID = "__CALLBACKID"; internal const string PreviousPageID = "__PREVIOUSPAGE"; int maxPageStateFieldLength = -1; string uniqueFilePathSuffix; HtmlHead htmlHeader; MasterPage masterPage; string masterPageFile; Page previousPage; bool isCrossPagePostBack; bool isPostBack; bool isCallback; List requireStateControls; HtmlForm _form; string _title; string _theme; string _styleSheetTheme; #if NET_4_0 string _metaDescription; string _metaKeywords; Control _autoPostBackControl; bool frameworkInitialized; #endif Hashtable items; bool _maintainScrollPositionOnPostBack; bool asyncMode = false; TimeSpan asyncTimeout; const double DefaultAsyncTimeout = 45.0; List parallelTasks; List serialTasks; ViewStateEncryptionMode viewStateEncryptionMode; bool controlRegisteredForViewStateEncryption = false; #region Constructors public Page () { scriptManager = new ClientScriptManager (this); Page = this; ID = "__Page"; PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection; if (ps != null) { asyncTimeout = ps.AsyncTimeout; viewStateEncryptionMode = ps.ViewStateEncryptionMode; _viewState = ps.EnableViewState; _viewStateMac = ps.EnableViewStateMac; } else { asyncTimeout = TimeSpan.FromSeconds (DefaultAsyncTimeout); viewStateEncryptionMode = ViewStateEncryptionMode.Auto; _viewState = true; } #if NET_4_0 this.ViewStateMode = ViewStateMode.Enabled; #endif } #endregion #region Properties [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpApplicationState Application { get { return _application; } } [EditorBrowsable (EditorBrowsableState.Never)] protected bool AspCompatMode { get { return false; } set { // nothing to do } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool Buffer { get { return Response.BufferOutput; } set { Response.BufferOutput = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public Cache Cache { get { if (_cache == null) throw new HttpException ("Cache is not available."); return _cache; } } [EditorBrowsableAttribute (EditorBrowsableState.Advanced)] [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) ? String.Empty : clientTarget; } set { clientTarget = value; if (value == String.Empty) clientTarget = null; } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public int CodePage { get { return Response.ContentEncoding.CodePage; } set { Response.ContentEncoding = Encoding.GetEncoding (value); } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string ContentType { get { return Response.ContentType; } set { Response.ContentType = value; } } protected internal override HttpContext Context { get { if (_context == null) return HttpContext.Current; return _context; } } [EditorBrowsable (EditorBrowsableState.Advanced)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string Culture { get { return Thread.CurrentThread.CurrentCulture.Name; } set { Thread.CurrentThread.CurrentCulture = GetPageCulture (value, Thread.CurrentThread.CurrentCulture); } } [EditorBrowsable (EditorBrowsableState.Never)] [Browsable (false)] [DefaultValue ("true")] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual bool EnableEventValidation { get { return _eventValidation; } set { if (IsInited) throw new InvalidOperationException ("The 'EnableEventValidation' property can be set only in the Page_init, the Page directive or in the configuration section."); _eventValidation = value; } } [Browsable (false)] public override bool EnableViewState { get { return _viewState; } set { _viewState = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] [EditorBrowsable (EditorBrowsableState.Never)] public bool EnableViewStateMac { get { return _viewStateMac; } set { _viewStateMac = value; } } internal bool EnableViewStateMacInternal { 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 { HttpContext ctx = Context; _errorPage = value; if (ctx != null) ctx.ErrorPage = value; } } [Obsolete ("The recommended alternative is HttpResponse.AddFileDependencies. http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Never)] protected ArrayList FileDependencies { set { if (Response != null) Response.AddFileDependencies (value); } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] public override string ID { get { return base.ID; } set { base.ID = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public bool IsPostBack { get { return isPostBack; } } public bool IsPostBackEventControlRegistered { get { return requiresRaiseEvent != null; } } [EditorBrowsable (EditorBrowsableState.Never), Browsable (false)] public bool IsReusable { get { return false; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public bool IsValid { get { if (!is_validated) throw new HttpException (Locale.GetText ("Page.IsValid cannot be called before validation has taken place. It should be queried in the event handler for a control that has CausesValidation=True and initiated the postback, or after a call to Page.Validate.")); foreach (IValidator val in Validators) if (!val.IsValid) return false; return true; } } [Browsable (false)] public IDictionary Items { get { if (items == null) items = new Hashtable (); return items; } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public int LCID { get { return Thread.CurrentThread.CurrentCulture.LCID; } set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public bool MaintainScrollPositionOnPostBack { get { return _maintainScrollPositionOnPostBack; } set { _maintainScrollPositionOnPostBack = value; } } public PageAdapter PageAdapter { get { return Adapter as PageAdapter; } } string _validationStartupScript; string _validationOnSubmitStatement; string _validationInitializeScript; string _webFormScriptReference; internal string WebFormScriptReference { get { if (_webFormScriptReference == null) _webFormScriptReference = IsMultiForm ? theForm : "window"; return _webFormScriptReference; } } internal string ValidationStartupScript { get { if (_validationStartupScript == null) { _validationStartupScript = @" " + WebFormScriptReference + @".Page_ValidationActive = false; " + WebFormScriptReference + @".ValidatorOnLoad(); " + WebFormScriptReference + @".ValidatorOnSubmit = function () { if (this.Page_ValidationActive) { return this.ValidatorCommonOnSubmit(); } return true; }; "; } return _validationStartupScript; } } internal string ValidationOnSubmitStatement { get { if (_validationOnSubmitStatement == null) _validationOnSubmitStatement = "if (!" + WebFormScriptReference + ".ValidatorOnSubmit()) return false;"; return _validationOnSubmitStatement; } } internal string ValidationInitializeScript { get { if (_validationInitializeScript == null) _validationInitializeScript = "WebFormValidation_Initialize(" + WebFormScriptReference + ");"; return _validationInitializeScript; } } internal IScriptManager ScriptManager { get { return (IScriptManager) Items [typeof (IScriptManager)]; } } #if !TARGET_J2EE internal string theForm { get { return "theForm"; } } internal bool IsMultiForm { get { return false; } } #endif [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpRequest Request { get { if (_request == null) throw new HttpException("Request is not available in this context."); return RequestInternal; } } internal HttpRequest RequestInternal { get { return _request; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpResponse Response { get { if (_response == null) throw new HttpException ("Response is not available in this context."); return _response; } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string ResponseEncoding { get { return Response.ContentEncoding.WebName; } set { Response.ContentEncoding = Encoding.GetEncoding (value); } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public HttpServerUtility Server { get { return Context.Server; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public virtual HttpSessionState Session { get { if (_session != null) return _session; try { _session = Context.Session; } catch { // ignore, should not throw } if (_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 _session; } } [Filterable (false)] [Obsolete ("The recommended alternative is Page.SetFocus and Page.MaintainScrollPositionOnPostBack. http://go.microsoft.com/fwlink/?linkid=14202")] [Browsable (false)] public bool SmartNavigation { get { return _smartNavigation; } set { _smartNavigation = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Filterable (false)] [Browsable (false)] public virtual string StyleSheetTheme { get { return _styleSheetTheme; } set { _styleSheetTheme = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual string Theme { get { return _theme; } set { _theme = value; } } void InitializeStyleSheet () { if (_styleSheetTheme == null) { PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection; if (ps != null) _styleSheetTheme = ps.StyleSheetTheme; } if (!String.IsNullOrEmpty (_styleSheetTheme)) { string virtualPath = "~/App_Themes/" + _styleSheetTheme; _styleSheetPageTheme = BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (PageTheme)) as PageTheme; } } void InitializeTheme () { if (_theme == null) { PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection; if (ps != null) _theme = ps.Theme; } if (!String.IsNullOrEmpty (_theme)) { string virtualPath = "~/App_Themes/" + _theme; _pageTheme = BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (PageTheme)) as PageTheme; if (_pageTheme != null) _pageTheme.SetPage (this); } } #if NET_4_0 public Control AutoPostBackControl { get { return _autoPostBackControl; } set { _autoPostBackControl = value; } } [BrowsableAttribute(false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public RouteData RouteData { get { if (_request == null) return null; RequestContext reqctx = _request.RequestContext; if (reqctx == null) return null; return reqctx.RouteData; } } [Bindable (true)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Localizable (true)] public string MetaDescription { get { if (_metaDescription == null) { if (htmlHeader == null) { if (frameworkInitialized) throw new InvalidOperationException ("A server-side head element is required to set this property."); return String.Empty; } else return htmlHeader.Description; } return _metaDescription; } set { if (htmlHeader == null) { if (frameworkInitialized) throw new InvalidOperationException ("A server-side head element is required to set this property."); _metaDescription = value; } else htmlHeader.Description = value; } } [Bindable (true)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Localizable (true)] public string MetaKeywords { get { if (_metaKeywords == null) { if (htmlHeader == null) { if (frameworkInitialized) throw new InvalidOperationException ("A server-side head element is required to set this property."); return String.Empty; } else return htmlHeader.Keywords; } return _metaDescription; } set { if (htmlHeader == null) { if (frameworkInitialized) throw new InvalidOperationException ("A server-side head element is required to set this property."); _metaKeywords = value; } else htmlHeader.Keywords = value; } } #endif [Localizable (true)] [Bindable (true)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public string Title { get { if (_title == null) { if (htmlHeader != null && htmlHeader.Title != null) return htmlHeader.Title; return String.Empty; } return _title; } set { if (htmlHeader != null) htmlHeader.Title = value; else _title = value; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [Browsable (false)] public TraceContext Trace { get { return Context.Trace; } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool TraceEnabled { get { return Trace.IsEnabled; } set { Trace.IsEnabled = value; } } [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public TraceMode TraceModeValue { get { return Trace.TraceMode; } set { Trace.TraceMode = value; } } [EditorBrowsable (EditorBrowsableState.Never)] protected int TransactionMode { get { return _transactionMode; } set { _transactionMode = value; } } [EditorBrowsable (EditorBrowsableState.Advanced)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public string UICulture { get { return Thread.CurrentThread.CurrentUICulture.Name; } set { Thread.CurrentThread.CurrentUICulture = GetPageCulture (value, Thread.CurrentThread.CurrentUICulture); } } [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 CultureInfo GetPageCulture (string culture, CultureInfo deflt) { if (culture == null) return deflt; CultureInfo ret = null; if (culture.StartsWith ("auto", StringComparison.InvariantCultureIgnoreCase)) { #if TARGET_J2EE if (!Context.IsServletRequest) return deflt; #endif string[] languages = Request.UserLanguages; try { if (languages != null && languages.Length > 0) ret = CultureInfo.CreateSpecificCulture (languages[0]); } catch { } if (ret == null) ret = deflt; } else ret = CultureInfo.CreateSpecificCulture (culture); return ret; } [EditorBrowsable (EditorBrowsableState.Never)] protected IAsyncResult AspCompatBeginProcessRequest (HttpContext context, AsyncCallback cb, object extraData) { throw new NotImplementedException (); } [EditorBrowsable (EditorBrowsableState.Never)] [MonoNotSupported ("Mono does not support classic ASP compatibility mode.")] protected void AspCompatEndProcessRequest (IAsyncResult result) { throw new NotImplementedException (); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual HtmlTextWriter CreateHtmlTextWriter (TextWriter tw) { if (Request.BrowserMightHaveSpecialWriter) return Request.Browser.CreateHtmlTextWriter(tw); else return new HtmlTextWriter (tw); } [EditorBrowsable (EditorBrowsableState.Never)] public void DesignerInitialize () { InitRecursive (null); } [EditorBrowsable (EditorBrowsableState.Advanced)] protected internal virtual NameValueCollection DeterminePostBackMode () { // if request was transfered from other page such Transfer if (_context.IsProcessingInclude) return null; HttpRequest req = Request; if (req == null) return null; NameValueCollection coll = null; if (0 == String.Compare (Request.HttpMethod, "POST", true, Helpers.InvariantCulture) #if TARGET_J2EE || !_context.IsServletRequest #endif ) coll = req.Form; else { string query = Request.QueryStringRaw; if (query == null || query.Length == 0) return null; coll = req.QueryString; } WebROCollection c = (WebROCollection) coll; allow_load = !c.GotID; if (allow_load) c.ID = GetTypeHashCode (); else allow_load = (c.ID == GetTypeHashCode ()); if (coll != null && coll ["__VIEWSTATE"] == null && coll ["__EVENTTARGET"] == null) return null; #if TARGET_J2EE if (getFacesContext () != null && _context.Handler != _context.CurrentHandler) { // check if it is PreviousPage string prevViewId = coll [PreviousPageID]; if (!String.IsNullOrEmpty (prevViewId)) { string appPath = VirtualPathUtility.RemoveTrailingSlash (Request.ApplicationPath); prevViewId = prevViewId.Substring (appPath.Length); isCrossPagePostBack = String.Compare (prevViewId, getFacesContext ().getExternalContext ().getRequestPathInfo (), StringComparison.OrdinalIgnoreCase) == 0; } } #endif return coll; } public override Control FindControl (string id) { if (id == ID) return this; else return base.FindControl (id); } Control FindControl (string id, bool decode) { #if TARGET_J2EE if (decode) id = DecodeNamespace (id); #endif return FindControl (id); } [Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackClientEvent (Control control, string argument) { return scriptManager.GetPostBackEventReference (control, argument); } [Obsolete ("The recommended alternative is ClientScript.GetPostBackClientHyperlink. http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackClientHyperlink (Control control, string argument) { return scriptManager.GetPostBackClientHyperlink (control, argument); } [Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackEventReference (Control control) { return scriptManager.GetPostBackEventReference (control, String.Empty); } [Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public string GetPostBackEventReference (Control control, string argument) { return scriptManager.GetPostBackEventReference (control, argument); } internal void RequiresFormScriptDeclaration () { requiresFormScriptDeclaration = true; } internal void RequiresPostBackScript () { if (requiresPostBackScript) return; ClientScript.RegisterHiddenField (postEventSourceID, String.Empty); ClientScript.RegisterHiddenField (postEventArgumentID, String.Empty); requiresPostBackScript = true; RequiresFormScriptDeclaration (); } [EditorBrowsable (EditorBrowsableState.Never)] public virtual int GetTypeHashCode () { return 0; } [MonoTODO ("The following properties of OutputCacheParameters are silently ignored: CacheProfile, SqlDependency")] [EditorBrowsable (EditorBrowsableState.Never)] protected internal virtual void InitOutputCache(OutputCacheParameters cacheSettings) { if (cacheSettings.Enabled) { InitOutputCache(cacheSettings.Duration, cacheSettings.VaryByContentEncoding, cacheSettings.VaryByHeader, cacheSettings.VaryByCustom, cacheSettings.Location, cacheSettings.VaryByParam); HttpResponse response = Response; HttpCachePolicy cache = response != null ? response.Cache : null; if (cache != null && cacheSettings.NoStore) cache.SetNoStore (); } } [MonoTODO ("varyByContentEncoding is not currently used")] [EditorBrowsable (EditorBrowsableState.Never)] protected virtual void InitOutputCache(int duration, string varyByContentEncoding, string varyByHeader, string varyByCustom, OutputCacheLocation location, string varyByParam) { if (duration <= 0) // No need to do anything, cache will be ineffective anyway return; HttpResponse response = Response; HttpCachePolicy cache = response.Cache; bool set_vary = false; HttpContext ctx = Context; DateTime timestamp = ctx != null ? ctx.Timestamp : DateTime.Now; switch (location) { case OutputCacheLocation.Any: cache.SetCacheability (HttpCacheability.Public); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (timestamp); set_vary = true; break; case OutputCacheLocation.Client: cache.SetCacheability (HttpCacheability.Private); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (timestamp); break; case OutputCacheLocation.Downstream: cache.SetCacheability (HttpCacheability.Public); cache.SetMaxAge (new TimeSpan (0, 0, duration)); cache.SetLastModified (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; } if (PageAdapter != null) { if (PageAdapter.CacheVaryByParams != null) { foreach (string p in PageAdapter.CacheVaryByParams) cache.VaryByParams [p] = true; } if (PageAdapter.CacheVaryByHeaders != null) { foreach (string h in PageAdapter.CacheVaryByHeaders) cache.VaryByHeaders [h] = true; } } } response.IsCached = true; cache.Duration = duration; cache.SetExpires (timestamp.AddSeconds (duration)); } [EditorBrowsable (EditorBrowsableState.Never)] protected virtual void InitOutputCache (int duration, string varyByHeader, string varyByCustom, OutputCacheLocation location, string varyByParam) { InitOutputCache (duration, null, varyByHeader, varyByCustom, location, varyByParam); } [Obsolete ("The recommended alternative is ClientScript.IsClientScriptBlockRegistered(string key). http://go.microsoft.com/fwlink/?linkid=14202")] public bool IsClientScriptBlockRegistered (string key) { return scriptManager.IsClientScriptBlockRegistered (key); } [Obsolete ("The recommended alternative is ClientScript.IsStartupScriptRegistered(string key). http://go.microsoft.com/fwlink/?linkid=14202")] public bool IsStartupScriptRegistered (string key) { return scriptManager.IsStartupScriptRegistered (key); } public string MapPath (string virtualPath) { return Request.MapPath (virtualPath); } protected internal override void Render (HtmlTextWriter writer) { if (MaintainScrollPositionOnPostBack) { ClientScript.RegisterWebFormClientScript (); ClientScript.RegisterHiddenField (ScrollPositionXID, Request [ScrollPositionXID]); ClientScript.RegisterHiddenField (ScrollPositionYID, Request [ScrollPositionYID]); StringBuilder script = new StringBuilder (); script.AppendLine (""); ClientScript.RegisterStartupScript (typeof (Page), "MaintainScrollPositionOnPostBackStartup", script.ToString()); } #if TARGET_J2EE if (bool.Parse (WebConfigurationManager.AppSettings [RenderBodyContentOnlyKey] ?? "false")) { for (Control c = this.Form; c != null; c = c.Parent) { HtmlGenericControl ch = (c as HtmlGenericControl); if (ch != null && ch.TagName == "body") { ch.RenderChildren (writer); return; } } } #endif base.Render (writer); } void RenderPostBackScript (HtmlTextWriter writer, string formUniqueID) { writer.WriteLine (); ClientScriptManager.WriteBeginScriptBlock (writer); RenderClientScriptFormDeclaration (writer, formUniqueID); writer.WriteLine (WebFormScriptReference + "._form = " + theForm + ";"); writer.WriteLine (WebFormScriptReference + ".__doPostBack = function (eventTarget, eventArgument) {"); writer.WriteLine ("\tif(" + theForm + ".onsubmit && " + theForm + ".onsubmit() == false) return;"); writer.WriteLine ("\t" + theForm + "." + postEventSourceID + ".value = eventTarget;"); writer.WriteLine ("\t" + theForm + "." + postEventArgumentID + ".value = eventArgument;"); writer.WriteLine ("\t" + theForm + ".submit();"); writer.WriteLine ("}"); ClientScriptManager.WriteEndScriptBlock (writer); } void RenderClientScriptFormDeclaration (HtmlTextWriter writer, string formUniqueID) { if (formScriptDeclarationRendered) return; if (PageAdapter != null) { writer.WriteLine ("\tvar {0} = {1};\n", theForm, PageAdapter.GetPostBackFormReference(formUniqueID)); } else { writer.WriteLine ("\tvar {0};\n\tif (document.getElementById) {{ {0} = document.getElementById ('{1}'); }}", theForm, formUniqueID); writer.WriteLine ("\telse {{ {0} = document.{1}; }}", theForm, formUniqueID); } #if TARGET_J2EE // TODO implement callback on portlet string serverUrl = Request.RawUrl; writer.WriteLine ("\t{0}.serverURL = {1};", theForm, ClientScriptManager.GetScriptLiteral (serverUrl)); writer.WriteLine ("\twindow.TARGET_J2EE = true;"); writer.WriteLine ("\twindow.IsMultiForm = {0};", IsMultiForm ? "true" : "false"); #endif formScriptDeclarationRendered = true; } internal void OnFormRender (HtmlTextWriter writer, string formUniqueID) { if (renderingForm) throw new HttpException ("Only 1 HtmlForm is allowed per page."); renderingForm = true; writer.WriteLine (); if (requiresFormScriptDeclaration || (scriptManager != null && scriptManager.ScriptsPresent) || PageAdapter != null) { ClientScriptManager.WriteBeginScriptBlock (writer); RenderClientScriptFormDeclaration (writer, formUniqueID); ClientScriptManager.WriteEndScriptBlock (writer); } if (handleViewState) #if TARGET_J2EE if (getFacesContext () != null) { javax.faces.application.ViewHandler viewHandler = getFacesContext ().getApplication ().getViewHandler (); javax.faces.context.ResponseWriter oldFacesWriter = SetupResponseWriter (writer); try { viewHandler.writeState (getFacesContext ()); } finally { getFacesContext ().setResponseWriter (oldFacesWriter); } } else #endif scriptManager.RegisterHiddenField ("__VIEWSTATE", _savedViewState); scriptManager.WriteHiddenFields (writer); if (requiresPostBackScript) { RenderPostBackScript (writer, formUniqueID); postBackScriptRendered = true; } scriptManager.WriteWebFormClientScript (writer); scriptManager.WriteClientScriptBlocks (writer); } internal IStateFormatter GetFormatter () { return new ObjectStateFormatter (this); } internal string GetSavedViewState () { return _savedViewState; } internal void OnFormPostRender (HtmlTextWriter writer, string formUniqueID) { scriptManager.SaveEventValidationState (); scriptManager.WriteExpandoAttributes (writer); scriptManager.WriteHiddenFields (writer); if (!postBackScriptRendered && requiresPostBackScript) RenderPostBackScript (writer, formUniqueID); scriptManager.WriteWebFormClientScript (writer); scriptManager.WriteArrayDeclares (writer); scriptManager.WriteStartupScriptBlocks (writer); renderingForm = false; postBackScriptRendered = false; } void ProcessPostData (NameValueCollection data, bool second) { NameValueCollection requestValues = _requestValueCollection == null ? new NameValueCollection (SecureHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant) : _requestValueCollection; if (data != null && data.Count > 0) { var used = new Dictionary (StringComparer.Ordinal); foreach (string id in data.AllKeys) { if (id == "__VIEWSTATE" || id == postEventSourceID || id == postEventArgumentID || id == ClientScriptManager.EventStateFieldName) continue; if (used.ContainsKey (id)) continue; used.Add (id, id); Control ctrl = FindControl (id, true); if (ctrl != null) { IPostBackDataHandler pbdh = ctrl as IPostBackDataHandler; IPostBackEventHandler pbeh = ctrl as IPostBackEventHandler; if (pbdh == null) { if (pbeh != null) formPostedRequiresRaiseEvent = pbeh; continue; } if (pbdh.LoadPostData (id, requestValues) == true) { if (requiresPostDataChanged == null) requiresPostDataChanged = new List (); requiresPostDataChanged.Add (pbdh); } if (_requiresPostBackCopy != null) _requiresPostBackCopy.Remove (id); } else if (!second) { if (secondPostData == null) secondPostData = new NameValueCollection (SecureHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant); secondPostData.Add (id, data [id]); } } } List list1 = null; if (_requiresPostBackCopy != null && _requiresPostBackCopy.Count > 0) { string [] handlers = (string []) _requiresPostBackCopy.ToArray (); foreach (string id in handlers) { IPostBackDataHandler pbdh = FindControl (id, true) as IPostBackDataHandler; if (pbdh != null) { _requiresPostBackCopy.Remove (id); if (pbdh.LoadPostData (id, requestValues)) { if (requiresPostDataChanged == null) requiresPostDataChanged = new List (); requiresPostDataChanged.Add (pbdh); } } else if (!second) { if (list1 == null) list1 = new List (); list1.Add (id); } } } _requiresPostBackCopy = second ? null : list1; if (second) secondPostData = null; } [EditorBrowsable (EditorBrowsableState.Never)] public virtual void ProcessRequest (HttpContext context) { SetContext (context); #if TARGET_J2EE bool wasException = false; IHttpHandler jsfHandler = getFacesContext () != null ? EnterThread () : null; #endif if (clientTarget != null) Request.ClientTarget = clientTarget; WireupAutomaticEvents (); //-- Control execution lifecycle in the docs // Save culture information because it can be modified in FrameworkInitialize() _appCulture = Thread.CurrentThread.CurrentCulture; _appUICulture = Thread.CurrentThread.CurrentUICulture; FrameworkInitialize (); #if NET_4_0 frameworkInitialized = true; #endif context.ErrorPage = _errorPage; try { InternalProcessRequest (); #if TARGET_J2EE } catch (Exception ex) { wasException = true; HandleException (ex); #else } catch (ThreadAbortException taex) { if (FlagEnd.Value == taex.ExceptionState) Thread.ResetAbort (); else throw; } catch (Exception e) { ProcessException (e); #endif } finally { #if TARGET_J2EE if (getFacesContext () != null) ExitThread (jsfHandler); else if (!wasException) #endif ProcessUnload (); } } void ProcessException (Exception e) { // We want to remove that error, as we're rethrowing to stop // further processing. Trace.Warn ("Unhandled Exception", e.ToString (), e); _context.AddError (e); // OnError might access LastError OnError (EventArgs.Empty); if (_context.HasError (e)) { _context.ClearError (e); throw new HttpUnhandledException (null, e); } } void ProcessUnload () { try { RenderTrace (); UnloadRecursive (true); } catch {} #if TARGET_J2EE if (getFacesContext () != null) { if(IsCrossPagePostBack) _context.Items [CrossPagePostBack] = this; } #endif if (Thread.CurrentThread.CurrentCulture.Equals (_appCulture) == false) Thread.CurrentThread.CurrentCulture = _appCulture; if (Thread.CurrentThread.CurrentUICulture.Equals (_appUICulture) == false) Thread.CurrentThread.CurrentUICulture = _appUICulture; _appCulture = null; _appUICulture = null; } delegate void ProcessRequestDelegate (HttpContext context); sealed class DummyAsyncResult : IAsyncResult { readonly object state; readonly WaitHandle asyncWaitHandle; readonly bool completedSynchronously; readonly bool isCompleted; public DummyAsyncResult (bool isCompleted, bool completedSynchronously, object state) { this.isCompleted = isCompleted; this.completedSynchronously = completedSynchronously; this.state = state; if (isCompleted) { asyncWaitHandle = new ManualResetEvent (true); } else { asyncWaitHandle = new ManualResetEvent (false); } } #region IAsyncResult Members public object AsyncState { get { return state; } } public WaitHandle AsyncWaitHandle { get { return asyncWaitHandle; } } public bool CompletedSynchronously { get { return completedSynchronously; } } public bool IsCompleted { get { return isCompleted; } } #endregion } [EditorBrowsable (EditorBrowsableState.Never)] protected IAsyncResult AsyncPageBeginProcessRequest (HttpContext context, AsyncCallback callback, object extraData) { ProcessRequest (context); DummyAsyncResult asyncResult = new DummyAsyncResult (true, true, extraData); if (callback != null) { callback (asyncResult); } return asyncResult; } [EditorBrowsable (EditorBrowsableState.Never)] protected void AsyncPageEndProcessRequest (IAsyncResult result) { } void InternalProcessRequest () { if (PageAdapter != null) _requestValueCollection = PageAdapter.DeterminePostBackMode(); else _requestValueCollection = this.DeterminePostBackMode(); // http://msdn2.microsoft.com/en-us/library/ms178141.aspx if (_requestValueCollection != null) { if (!isCrossPagePostBack && _requestValueCollection [PreviousPageID] != null && _requestValueCollection [PreviousPageID] != Request.FilePath) { _doLoadPreviousPage = true; } else { isCallback = _requestValueCollection [CallbackArgumentID] != null; // LAMESPEC: on Callback IsPostBack is set to false, but true. //isPostBack = !isCallback; isPostBack = true; } string lastFocus = _requestValueCollection [LastFocusID]; if (!String.IsNullOrEmpty (lastFocus)) _focusedControlID = UniqueID2ClientID (lastFocus); } if (!isCrossPagePostBack) { if (_context.PreviousHandler is Page) previousPage = (Page) _context.PreviousHandler; } Trace.Write ("aspx.page", "Begin PreInit"); OnPreInit (EventArgs.Empty); Trace.Write ("aspx.page", "End PreInit"); InitializeTheme (); ApplyMasterPage (); Trace.Write ("aspx.page", "Begin Init"); InitRecursive (null); Trace.Write ("aspx.page", "End Init"); Trace.Write ("aspx.page", "Begin InitComplete"); OnInitComplete (EventArgs.Empty); Trace.Write ("aspx.page", "End InitComplete"); renderingForm = false; #if TARGET_J2EE if (getFacesContext () != null) if (IsPostBack || IsCallback) return; #endif RestorePageState (); ProcessPostData (); ProcessRaiseEvents (); if (ProcessLoadComplete ()) return; #if TARGET_J2EE if (getFacesContext () != null) { getFacesContext ().renderResponse (); return; } #endif RenderPage (); } void RestorePageState () { if (IsPostBack || IsCallback) { if (_requestValueCollection != null) scriptManager.RestoreEventValidationState ( _requestValueCollection [ClientScriptManager.EventStateFieldName]); Trace.Write ("aspx.page", "Begin LoadViewState"); LoadPageViewState (); Trace.Write ("aspx.page", "End LoadViewState"); } } void ProcessPostData () { if (IsPostBack || IsCallback) { Trace.Write ("aspx.page", "Begin ProcessPostData"); ProcessPostData (_requestValueCollection, false); Trace.Write ("aspx.page", "End ProcessPostData"); } ProcessLoad (); if (IsPostBack || IsCallback) { Trace.Write ("aspx.page", "Begin ProcessPostData Second Try"); ProcessPostData (secondPostData, true); Trace.Write ("aspx.page", "End ProcessPostData Second Try"); } } void ProcessLoad () { Trace.Write ("aspx.page", "Begin PreLoad"); OnPreLoad (EventArgs.Empty); Trace.Write ("aspx.page", "End PreLoad"); Trace.Write ("aspx.page", "Begin Load"); LoadRecursive (); Trace.Write ("aspx.page", "End Load"); } void ProcessRaiseEvents () { if (IsPostBack || IsCallback) { 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"); } } bool ProcessLoadComplete () { Trace.Write ("aspx.page", "Begin LoadComplete"); OnLoadComplete (EventArgs.Empty); Trace.Write ("aspx.page", "End LoadComplete"); if (IsCrossPagePostBack) return true; if (IsCallback) { #if TARGET_J2EE if (getFacesContext () != null) { _callbackTarget = GetCallbackTarget (); ProcessRaiseCallbackEvent (_callbackTarget, ref _callbackEventError); return true; } #endif string result = ProcessCallbackData (); HtmlTextWriter callbackOutput = new HtmlTextWriter (Response.Output); callbackOutput.Write (result); callbackOutput.Flush (); return true; } Trace.Write ("aspx.page", "Begin PreRender"); PreRenderRecursiveInternal (); Trace.Write ("aspx.page", "End PreRender"); ExecuteRegisteredAsyncTasks (); Trace.Write ("aspx.page", "Begin PreRenderComplete"); OnPreRenderComplete (EventArgs.Empty); Trace.Write ("aspx.page", "End PreRenderComplete"); Trace.Write ("aspx.page", "Begin SaveViewState"); SavePageViewState (); Trace.Write ("aspx.page", "End SaveViewState"); Trace.Write ("aspx.page", "Begin SaveStateComplete"); OnSaveStateComplete (EventArgs.Empty); Trace.Write ("aspx.page", "End SaveStateComplete"); return false; } internal void RenderPage () { scriptManager.ResetEventValidationState (); //-- Trace.Write ("aspx.page", "Begin Render"); HtmlTextWriter output = CreateHtmlTextWriter (Response.Output); RenderControl (output); Trace.Write ("aspx.page", "End Render"); } internal void SetContext (HttpContext context) { _context = context; _application = context.Application; _response = context.Response; _request = context.Request; _cache = context.Cache; } void RenderTrace () { 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) { HtmlTextWriter output = new HtmlTextWriter (Response.Output); Trace.Render (output); } } void RaisePostBackEvents () { if (requiresRaiseEvent != null) { RaisePostBackEvent (requiresRaiseEvent, null); return; } if (formPostedRequiresRaiseEvent != null) { RaisePostBackEvent (formPostedRequiresRaiseEvent, null); return; } NameValueCollection postdata = _requestValueCollection; if (postdata == null) return; string eventTarget = postdata [postEventSourceID]; IPostBackEventHandler target; if (String.IsNullOrEmpty (eventTarget)) { #if NET_4_0 target = AutoPostBackControl as IPostBackEventHandler; if (target != null) RaisePostBackEvent (target, null); else #endif if (formPostedRequiresRaiseEvent != null) RaisePostBackEvent (formPostedRequiresRaiseEvent, null); else Validate (); return; } target = FindControl (eventTarget, true) as IPostBackEventHandler; #if NET_4_0 if (target == null) target = AutoPostBackControl as IPostBackEventHandler; #endif 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); } [Obsolete ("The recommended alternative is ClientScript.RegisterArrayDeclaration(string arrayName, string arrayValue). http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterArrayDeclaration (string arrayName, string arrayValue) { scriptManager.RegisterArrayDeclaration (arrayName, arrayValue); } [Obsolete ("The recommended alternative is ClientScript.RegisterClientScriptBlock(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterClientScriptBlock (string key, string script) { scriptManager.RegisterClientScriptBlock (key, script); } [Obsolete] [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue) { scriptManager.RegisterHiddenField (hiddenFieldName, hiddenFieldInitialValue); } [MonoTODO("Not implemented, Used in HtmlForm")] internal void RegisterClientScriptFile (string a, string b, string c) { throw new NotImplementedException (); } [Obsolete ("The recommended alternative is ClientScript.RegisterOnSubmitStatement(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")] [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterOnSubmitStatement (string key, string script) { scriptManager.RegisterOnSubmitStatement (key, script); } internal string GetSubmitStatements () { return scriptManager.WriteSubmitStatements (); } [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterRequiresPostBack (Control control) { if (!(control is IPostBackDataHandler)) throw new HttpException ("The control to register does not implement the IPostBackDataHandler interface."); if (_requiresPostBack == null) _requiresPostBack = new List (); string uniqueID = control.UniqueID; if (_requiresPostBack.Contains (uniqueID)) return; _requiresPostBack.Add (uniqueID); } [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void RegisterRequiresRaiseEvent (IPostBackEventHandler control) { requiresRaiseEvent = control; } [Obsolete ("The recommended alternative is ClientScript.RegisterStartupScript(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")] [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) { PageStatePersister persister = this.PageStatePersister; if (persister == null) return; Pair pair = viewState as Pair; if (pair != null) { persister.ViewState = pair.First; persister.ControlState = pair.Second; } else persister.ViewState = viewState; persister.Save (); } internal string RawViewState { get { NameValueCollection postdata = _requestValueCollection; string view_state; if (postdata == null || (view_state = postdata ["__VIEWSTATE"]) == null) return null; if (view_state == String.Empty) return null; return view_state; } set { _savedViewState = value; } } protected virtual PageStatePersister PageStatePersister { get { if (page_state_persister == null && PageAdapter != null) page_state_persister = PageAdapter.GetStatePersister(); if (page_state_persister == null) page_state_persister = new HiddenFieldPageStatePersister (this); return page_state_persister; } } [EditorBrowsable (EditorBrowsableState.Advanced)] protected virtual object LoadPageStateFromPersistenceMedium () { PageStatePersister persister = this.PageStatePersister; if (persister == null) return null; persister.Load (); return new Pair (persister.ViewState, persister.ControlState); } internal void LoadPageViewState () { Pair sState = LoadPageStateFromPersistenceMedium () as Pair; if (sState != null) { if (allow_load || isCrossPagePostBack) { LoadPageControlState (sState.Second); Pair vsr = sState.First as Pair; if (vsr != null) { LoadViewStateRecursive (vsr.First); _requiresPostBackCopy = vsr.Second as List ; } } } } internal void SavePageViewState () { if (!handleViewState) return; object controlState = SavePageControlState (); Pair vsr = null; object viewState = null; if (EnableViewState #if NET_4_0 && this.ViewStateMode == ViewStateMode.Enabled #endif ) viewState = SaveViewStateRecursive (); object reqPostback = (_requiresPostBack != null && _requiresPostBack.Count > 0) ? _requiresPostBack : null; if (viewState != null || reqPostback != null) vsr = new Pair (viewState, reqPostback); Pair pair = new Pair (); pair.First = vsr; pair.Second = controlState; if (pair.First == null && pair.Second == null) SavePageStateToPersistenceMedium (null); else SavePageStateToPersistenceMedium (pair); } public virtual void Validate () { is_validated = true; ValidateCollection (_validators); } internal bool AreValidatorsUplevel () { return AreValidatorsUplevel (String.Empty); } internal bool AreValidatorsUplevel (string valGroup) { bool uplevel = false; foreach (IValidator v in Validators) { BaseValidator bv = v as BaseValidator; if (bv == null) continue; if (valGroup != bv.ValidationGroup) continue; if (bv.GetRenderUplevel()) { uplevel = true; break; } } return uplevel; } bool ValidateCollection (ValidatorCollection validators) { if (validators == null || validators.Count == 0) return true; bool all_valid = true; foreach (IValidator v in validators){ v.Validate (); if (v.IsValid == false) all_valid = false; } return all_valid; } [EditorBrowsable (EditorBrowsableState.Advanced)] public virtual void VerifyRenderingInServerForm (Control control) { if (Context == null) return; if (IsCallback) return; if (!renderingForm) throw new HttpException ("Control '" + control.ClientID + "' of type '" + control.GetType ().Name + "' must be placed inside a form tag with runat=server."); } protected override void FrameworkInitialize () { base.FrameworkInitialize (); InitializeStyleSheet (); } #endregion public ClientScriptManager ClientScript { get { return scriptManager; } } internal static readonly object InitCompleteEvent = new object (); internal static readonly object LoadCompleteEvent = new object (); internal static readonly object PreInitEvent = new object (); internal static readonly object PreLoadEvent = new object (); internal static readonly object PreRenderCompleteEvent = new object (); internal static readonly object SaveStateCompleteEvent = new object (); int event_mask; const int initcomplete_mask = 1; const int loadcomplete_mask = 1 << 1; const int preinit_mask = 1 << 2; const int preload_mask = 1 << 3; const int prerendercomplete_mask = 1 << 4; const int savestatecomplete_mask = 1 << 5; [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler InitComplete { add { event_mask |= initcomplete_mask; Events.AddHandler (InitCompleteEvent, value); } remove { Events.RemoveHandler (InitCompleteEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler LoadComplete { add { event_mask |= loadcomplete_mask; Events.AddHandler (LoadCompleteEvent, value); } remove { Events.RemoveHandler (LoadCompleteEvent, value); } } public event EventHandler PreInit { add { event_mask |= preinit_mask; Events.AddHandler (PreInitEvent, value); } remove { Events.RemoveHandler (PreInitEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler PreLoad { add { event_mask |= preload_mask; Events.AddHandler (PreLoadEvent, value); } remove { Events.RemoveHandler (PreLoadEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler PreRenderComplete { add { event_mask |= prerendercomplete_mask; Events.AddHandler (PreRenderCompleteEvent, value); } remove { Events.RemoveHandler (PreRenderCompleteEvent, value); } } [EditorBrowsable (EditorBrowsableState.Advanced)] public event EventHandler SaveStateComplete { add { event_mask |= savestatecomplete_mask; Events.AddHandler (SaveStateCompleteEvent, value); } remove { Events.RemoveHandler (SaveStateCompleteEvent, value); } } protected virtual void OnInitComplete (EventArgs e) { if ((event_mask & initcomplete_mask) != 0) { EventHandler eh = (EventHandler) (Events [InitCompleteEvent]); if (eh != null) eh (this, e); } } protected virtual void OnLoadComplete (EventArgs e) { if ((event_mask & loadcomplete_mask) != 0) { EventHandler eh = (EventHandler) (Events [LoadCompleteEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreInit (EventArgs e) { if ((event_mask & preinit_mask) != 0) { EventHandler eh = (EventHandler) (Events [PreInitEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreLoad (EventArgs e) { if ((event_mask & preload_mask) != 0) { EventHandler eh = (EventHandler) (Events [PreLoadEvent]); if (eh != null) eh (this, e); } } protected virtual void OnPreRenderComplete (EventArgs e) { if ((event_mask & prerendercomplete_mask) != 0) { EventHandler eh = (EventHandler) (Events [PreRenderCompleteEvent]); if (eh != null) eh (this, e); } if (Form == null) return; if (!Form.DetermineRenderUplevel ()) return; string defaultButtonId = Form.DefaultButton; /* figure out if we have some control we're going to focus */ if (String.IsNullOrEmpty (_focusedControlID)) { _focusedControlID = Form.DefaultFocus; if (String.IsNullOrEmpty (_focusedControlID)) _focusedControlID = defaultButtonId; } if (!String.IsNullOrEmpty (_focusedControlID)) { ClientScript.RegisterWebFormClientScript (); ClientScript.RegisterStartupScript ( typeof(Page), "HtmlForm-DefaultButton-StartupScript", "\n" + WebFormScriptReference + ".WebForm_AutoFocus('" + _focusedControlID + "');\n", true); } if (Form.SubmitDisabledControls && _hasEnabledControlArray) { ClientScript.RegisterWebFormClientScript (); ClientScript.RegisterOnSubmitStatement ( typeof (Page), "HtmlForm-SubmitDisabledControls-SubmitStatement", WebFormScriptReference + ".WebForm_ReEnableControls();"); } } internal void RegisterEnabledControl (Control control) { if (Form == null || !Page.Form.SubmitDisabledControls || !Page.Form.DetermineRenderUplevel ()) return; _hasEnabledControlArray = true; Page.ClientScript.RegisterArrayDeclaration (EnabledControlArrayID, String.Concat ("'", control.ClientID, "'")); } protected virtual void OnSaveStateComplete (EventArgs e) { if ((event_mask & savestatecomplete_mask) != 0) { EventHandler eh = (EventHandler) (Events [SaveStateCompleteEvent]); if (eh != null) eh (this, e); } } public HtmlForm Form { get { return _form; } } internal void RegisterForm (HtmlForm form) { _form = form; } public string ClientQueryString { get { return Request.UrlComponents.Query; } } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public Page PreviousPage { get { if (_doLoadPreviousPage) { _doLoadPreviousPage = false; LoadPreviousPageReference (); } return previousPage; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public bool IsCallback { get { return isCallback; } } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public bool IsCrossPagePostBack { get { return isCrossPagePostBack; } } [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public new virtual char IdSeparator { get { //TODO: why override? return base.IdSeparator; } } string ProcessCallbackData () { ICallbackEventHandler target = GetCallbackTarget (); string callbackEventError = String.Empty; ProcessRaiseCallbackEvent (target, ref callbackEventError); return ProcessGetCallbackResult (target, callbackEventError); } ICallbackEventHandler GetCallbackTarget () { string callbackTarget = _requestValueCollection [CallbackSourceID]; if (callbackTarget == null || callbackTarget.Length == 0) throw new HttpException ("Callback target not provided."); Control targetControl = FindControl (callbackTarget, true); ICallbackEventHandler target = targetControl as ICallbackEventHandler; if (target == null) throw new HttpException (string.Format ("Invalid callback target '{0}'.", callbackTarget)); return target; } void ProcessRaiseCallbackEvent (ICallbackEventHandler target, ref string callbackEventError) { string callbackArgument = _requestValueCollection [CallbackArgumentID]; try { target.RaiseCallbackEvent (callbackArgument); } catch (Exception ex) { callbackEventError = String.Concat ("e", RuntimeHelpers.DebuggingEnabled ? ex.ToString () : ex.Message); } } string ProcessGetCallbackResult (ICallbackEventHandler target, string callbackEventError) { string callBackResult; try { callBackResult = target.GetCallbackResult (); } catch (Exception ex) { return String.Concat ("e", RuntimeHelpers.DebuggingEnabled ? ex.ToString () : ex.Message); } string eventValidation = ClientScript.GetEventValidationStateFormatted (); return callbackEventError + (eventValidation == null ? "0" : eventValidation.Length.ToString ()) + "|" + eventValidation + callBackResult; } [BrowsableAttribute (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public HtmlHead Header { get { return htmlHeader; } } internal void SetHeader (HtmlHead header) { htmlHeader = header; if (header == null) return; if (_title != null) { htmlHeader.Title = _title; _title = null; } #if NET_4_0 if (_metaDescription != null) { htmlHeader.Description = _metaDescription; _metaDescription = null; } if (_metaKeywords != null) { htmlHeader.Keywords = _metaKeywords; _metaKeywords = null; } #endif } [EditorBrowsable (EditorBrowsableState.Never)] protected bool AsyncMode { get { return asyncMode; } set { asyncMode = value; } } [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [EditorBrowsable (EditorBrowsableState.Advanced)] public TimeSpan AsyncTimeout { get { return asyncTimeout; } set { asyncTimeout = value; } } public bool IsAsync { get { return AsyncMode; } } protected internal virtual string UniqueFilePathSuffix { get { if (String.IsNullOrEmpty (uniqueFilePathSuffix)) uniqueFilePathSuffix = "__ufps=" + AppRelativeVirtualPath.GetHashCode ().ToString ("x"); return uniqueFilePathSuffix; } } [MonoTODO ("Actually use the value in code.")] [Browsable (false)] [EditorBrowsable (EditorBrowsableState.Never)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public int MaxPageStateFieldLength { get { return maxPageStateFieldLength; } set { maxPageStateFieldLength = value; } } public void AddOnPreRenderCompleteAsync (BeginEventHandler beginHandler, EndEventHandler endHandler) { AddOnPreRenderCompleteAsync (beginHandler, endHandler, null); } public void AddOnPreRenderCompleteAsync (BeginEventHandler beginHandler, EndEventHandler endHandler, Object state) { if (!IsAsync) { throw new InvalidOperationException ("AddOnPreRenderCompleteAsync called and Page.IsAsync == false"); } if (IsPrerendered) { throw new InvalidOperationException ("AddOnPreRenderCompleteAsync can only be called before and during PreRender."); } if (beginHandler == null) { throw new ArgumentNullException ("beginHandler"); } if (endHandler == null) { throw new ArgumentNullException ("endHandler"); } RegisterAsyncTask (new PageAsyncTask (beginHandler, endHandler, null, state, false)); } List ParallelTasks { get { if (parallelTasks == null) parallelTasks = new List(); return parallelTasks; } } List SerialTasks { get { if (serialTasks == null) serialTasks = new List (); return serialTasks; } } public void RegisterAsyncTask (PageAsyncTask task) { if (task == null) throw new ArgumentNullException ("task"); if (task.ExecuteInParallel) ParallelTasks.Add (task); else SerialTasks.Add (task); } public void ExecuteRegisteredAsyncTasks () { if ((parallelTasks == null || parallelTasks.Count == 0) && (serialTasks == null || serialTasks.Count == 0)){ return; } if (parallelTasks != null) { DateTime startExecution = DateTime.Now; List localParallelTasks = parallelTasks; parallelTasks = null; // Shouldn't execute tasks twice List asyncResults = new List(); foreach (PageAsyncTask parallelTask in localParallelTasks) { IAsyncResult result = parallelTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), parallelTask); if (result.CompletedSynchronously) parallelTask.EndHandler (result); else asyncResults.Add (result); } if (asyncResults.Count > 0) { WaitHandle [] waitArray = new WaitHandle [asyncResults.Count]; int i = 0; for (i = 0; i < asyncResults.Count; i++) { waitArray [i] = asyncResults [i].AsyncWaitHandle; } bool allSignalled = WaitHandle.WaitAll (waitArray, AsyncTimeout, false); if (!allSignalled) { for (i = 0; i < asyncResults.Count; i++) { if (!asyncResults [i].IsCompleted) { localParallelTasks [i].TimeoutHandler (asyncResults [i]); } } } } DateTime endWait = DateTime.Now; TimeSpan elapsed = endWait - startExecution; if (elapsed <= AsyncTimeout) AsyncTimeout -= elapsed; else AsyncTimeout = TimeSpan.FromTicks(0); } if (serialTasks != null) { List localSerialTasks = serialTasks; serialTasks = null; // Shouldn't execute tasks twice foreach (PageAsyncTask serialTask in localSerialTasks) { DateTime startExecution = DateTime.Now; IAsyncResult result = serialTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), serialTask); if (result.CompletedSynchronously) serialTask.EndHandler (result); else { bool done = result.AsyncWaitHandle.WaitOne (AsyncTimeout, false); if (!done && !result.IsCompleted) { serialTask.TimeoutHandler (result); } } DateTime endWait = DateTime.Now; TimeSpan elapsed = endWait - startExecution; if (elapsed <= AsyncTimeout) AsyncTimeout -= elapsed; else AsyncTimeout = TimeSpan.FromTicks (0); } } AsyncTimeout = TimeSpan.FromSeconds (DefaultAsyncTimeout); } void EndAsyncTaskCallback (IAsyncResult result) { PageAsyncTask task = (PageAsyncTask)result.AsyncState; task.EndHandler (result); } public static HtmlTextWriter CreateHtmlTextWriterFromType (TextWriter tw, Type writerType) { Type htmlTextWriterType = typeof (HtmlTextWriter); if (!htmlTextWriterType.IsAssignableFrom (writerType)) { throw new HttpException (String.Format ("Type '{0}' cannot be assigned to HtmlTextWriter", writerType.FullName)); } ConstructorInfo constructor = writerType.GetConstructor (new Type [] { typeof (TextWriter) }); if (constructor == null) { throw new HttpException (String.Format ("Type '{0}' does not have a consturctor that takes a TextWriter as parameter", writerType.FullName)); } return (HtmlTextWriter) Activator.CreateInstance(writerType, tw); } [Browsable (false)] [DefaultValue ("0")] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [EditorBrowsable (EditorBrowsableState.Never)] public ViewStateEncryptionMode ViewStateEncryptionMode { get { return viewStateEncryptionMode; } set { viewStateEncryptionMode = value; } } public void RegisterRequiresViewStateEncryption () { controlRegisteredForViewStateEncryption = true; } internal bool NeedViewStateEncryption { get { return (ViewStateEncryptionMode == ViewStateEncryptionMode.Always || (ViewStateEncryptionMode == ViewStateEncryptionMode.Auto && controlRegisteredForViewStateEncryption)); } } void ApplyMasterPage () { if (masterPageFile != null && masterPageFile.Length > 0) { MasterPage master = Master; if (master != null) { var appliedMasterPageFiles = new Dictionary (StringComparer.Ordinal); MasterPage.ApplyMasterPageRecursive (Request.CurrentExecutionFilePath, HostingEnvironment.VirtualPathProvider, master, appliedMasterPageFiles); master.Page = this; Controls.Clear (); Controls.Add (master); } } } [DefaultValueAttribute ("")] public virtual string MasterPageFile { get { return masterPageFile; } set { masterPageFile = value; masterPage = null; } } [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] [BrowsableAttribute (false)] public MasterPage Master { get { if (Context == null || String.IsNullOrEmpty (masterPageFile)) return null; if (masterPage == null) masterPage = MasterPage.CreateMasterPage (this, Context, masterPageFile, contentTemplates); return masterPage; } } public void SetFocus (string clientID) { if (String.IsNullOrEmpty (clientID)) throw new ArgumentNullException ("control"); if (IsPrerendered) throw new InvalidOperationException ("SetFocus can only be called before and during PreRender."); if(Form==null) throw new InvalidOperationException ("A form tag with runat=server must exist on the Page to use SetFocus() or the Focus property."); _focusedControlID = clientID; } public void SetFocus (Control control) { if (control == null) throw new ArgumentNullException ("control"); SetFocus (control.ClientID); } [EditorBrowsable (EditorBrowsableState.Advanced)] public void RegisterRequiresControlState (Control control) { if (control == null) throw new ArgumentNullException ("control"); if (RequiresControlState (control)) return; if (requireStateControls == null) requireStateControls = new List (); requireStateControls.Add (control); int n = requireStateControls.Count - 1; if (_savedControlState == null || n >= _savedControlState.Length) return; for (Control parent = control.Parent; parent != null; parent = parent.Parent) if (parent.IsChildControlStateCleared) return; object state = _savedControlState [n]; if (state != null) control.LoadControlState (state); } 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 == String.Empty) validationGroup = null; ValidatorCollection col = new ValidatorCollection (); if (_validators == null) return col; foreach (IValidator v in _validators) if (BelongsToGroup(v, validationGroup)) col.Add(v); return col; } bool BelongsToGroup(IValidator v, string validationGroup) { BaseValidator validator = v as BaseValidator; if (validationGroup == null) return validator == null || String.IsNullOrEmpty (validator.ValidationGroup); else return validator != null && validator.ValidationGroup == validationGroup; } public virtual void Validate (string validationGroup) { is_validated = true; ValidateCollection (GetValidators (validationGroup)); } object SavePageControlState () { int count = requireStateControls == null ? 0 : requireStateControls.Count; if (count == 0) return null; object state; object[] controlStates = new object [count]; object[] adapterState = new object [count]; Control control; ControlAdapter adapter; bool allNull = true; TraceContext trace = (Context != null && Context.Trace.IsEnabled) ? Context.Trace : null; for (int n = 0; n < count; n++) { control = requireStateControls [n]; state = controlStates [n] = control.SaveControlState (); if (state != null) allNull = false; if (trace != null) trace.SaveControlState (control, state); adapter = control.Adapter; if (adapter != null) { adapterState [n] = adapter.SaveAdapterControlState (); if (adapterState [n] != null) allNull = false; } } if (allNull) return null; else return new Pair (controlStates, adapterState); } void LoadPageControlState (object data) { _savedControlState = null; if (data == null) return; Pair statePair = (Pair)data; _savedControlState = (object[]) statePair.First; object[] adapterState = (object[]) statePair.Second; if (requireStateControls == null) return; int min = Math.Min (requireStateControls.Count, _savedControlState != null ? _savedControlState.Length : requireStateControls.Count); for (int n=0; n < min; n++) { Control ctl = (Control) requireStateControls [n]; ctl.LoadControlState (_savedControlState != null ? _savedControlState [n] : null); if (ctl.Adapter != null) ctl.Adapter.LoadAdapterControlState (adapterState != null ? adapterState [n] : null); } } void LoadPreviousPageReference () { if (_requestValueCollection != null) { string prevPage = _requestValueCollection [PreviousPageID]; if (prevPage != null) { #if TARGET_J2EE if (getFacesContext () != null) { IHttpHandler handler = Context.ApplicationInstance.GetHandler (Context, prevPage); Server.Execute (handler, null, true, _context.Request.CurrentExecutionFilePath, null, false, false); if (_context.Items.Contains (CrossPagePostBack)) { previousPage = (Page) _context.Items [CrossPagePostBack]; _context.Items.Remove (CrossPagePostBack); } return; } #else IHttpHandler handler; handler = BuildManager.CreateInstanceFromVirtualPath (prevPage, typeof (IHttpHandler)) as IHttpHandler; previousPage = (Page) handler; previousPage.isCrossPagePostBack = true; Server.Execute (handler, null, true, _context.Request.CurrentExecutionFilePath, null, false, false); #endif } } } Hashtable contentTemplates; [EditorBrowsable (EditorBrowsableState.Never)] protected internal void AddContentTemplate (string templateName, ITemplate template) { if (contentTemplates == null) contentTemplates = new Hashtable (); contentTemplates [templateName] = template; } PageTheme _pageTheme; internal PageTheme PageTheme { get { return _pageTheme; } } PageTheme _styleSheetPageTheme; internal PageTheme StyleSheetPageTheme { get { return _styleSheetPageTheme; } } Stack dataItemCtx; internal void PushDataItemContext (object o) { if (dataItemCtx == null) dataItemCtx = new Stack (); dataItemCtx.Push (o); } internal void PopDataItemContext () { if (dataItemCtx == null) throw new InvalidOperationException (); dataItemCtx.Pop (); } public object GetDataItem() { if (dataItemCtx == null || dataItemCtx.Count == 0) throw new InvalidOperationException ("No data item"); return dataItemCtx.Peek (); } void AddStyleSheets (PageTheme theme, ref List links) { if (theme == null) return; string[] tmpThemes = theme != null ? theme.GetStyleSheets () : null; if (tmpThemes == null || tmpThemes.Length == 0) return; if (links == null) links = new List (); links.AddRange (tmpThemes); } protected internal override void OnInit (EventArgs e) { base.OnInit (e); List themes = null; AddStyleSheets (StyleSheetPageTheme, ref themes); AddStyleSheets (PageTheme, ref themes); if (themes == null) return; HtmlHead header = Header; if (themes != null && header == null) throw new InvalidOperationException ("Using themed css files requires a header control on the page."); ControlCollection headerControls = header.Controls; string lss; for (int i = themes.Count - 1; i >= 0; i--) { lss = themes [i]; HtmlLink hl = new HtmlLink (); hl.Href = lss; hl.Attributes["type"] = "text/css"; hl.Attributes["rel"] = "stylesheet"; headerControls.AddAt (0, hl); } } [MonoDocumentationNote ("Not implemented. Only used by .net aspx parser")] [EditorBrowsable (EditorBrowsableState.Never)] protected object GetWrappedFileDependencies (string [] list) { return list; } [MonoDocumentationNote ("Does nothing. Used by .net aspx parser")] protected virtual void InitializeCulture () { } [MonoDocumentationNote ("Does nothing. Used by .net aspx parser")] [EditorBrowsable (EditorBrowsableState.Never)] protected internal void AddWrappedFileDependencies (object virtualFileDependencies) { } } }