* System.Web.dll.sources: Added
System.Web.Compilation/ForceCopyBuildProvider.cs and
- System.Web.Compilation/MasterPageBuildProvider.cs
+ System.Web.Compilation/MasterPageBuildProvider.cs and
+ System.Web.UI/PageLifeCycle.cs
2006-11-09 Vladimir Krasnov <vladimirk@mainsoft.com>
+2006-11-17 Marek Habersack <grendello@gmail.com>
+
+ * HtmlInputHidden.cs: Added support for event validation.
+
+ * HtmlInputCheckBox.cs: Added support for event validation.
+
+ * HtmlInputImage.cs: Added support for event validation.
+
+ * HtmlInputButton.cs: Added support for event validation.
+
+ * HtmlSelect.cs: Added support for event validation.
+
+ * HtmlTextArea.cs: Added support for event validation.
+
+ * HtmlButton.cs: Added support for event validation.
+
+ * HtmlInputRadioButton.cs: Added support for event validation.
+
+ * HtmlInputText.cs: Added support for event validation.
+
2006-11-13 Igor Zelmanovich <igorz@mainsoft.com>
* HtmlContainerControl.cs: fixed: InnerHtml property
#endif
OnServerClick (EventArgs.Empty);
}
-
+
#if NET_2_0
protected internal
#else
#if NET_2_0
if (Page != null && Events [ServerClickEvent] != null) {
PostBackOptions options = GetPostBackOptions ();
+ Page.ClientScript.RegisterForEventValidation (options);
Attributes ["onclick"] += Page.ClientScript.GetPostBackEventReference (options);
writer.WriteAttribute ("language", "javascript");
}
}
if (Page != null) {
PostBackOptions options = GetPostBackOptions ();
+ Page.ClientScript.RegisterForEventValidation (options);
onclick += Page.ClientScript.GetPostBackEventReference (options);
}
}
}
+#if NET_2_0
+ protected override void RenderAttributes (HtmlTextWriter writer)
+ {
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+ base.RenderAttributes (writer);
+ }
+#endif
+
#if NET_2_0
protected internal
#else
}
#if NET_2_0
+ protected override void RenderAttributes (HtmlTextWriter writer)
+ {
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+ base.RenderAttributes (writer);
+ }
+
protected internal
#else
protected
protected override void RenderAttributes (HtmlTextWriter writer)
{
#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+
if (CausesValidation && Page != null && Page.AreValidatorsUplevel (ValidationGroup)) {
ClientScriptManager csm = Page.ClientScript;
Attributes ["onclick"] += csm.GetClientValidationEvent (ValidationGroup);
}
}
-
#if NET_2_0
protected internal
#else
protected override void RenderAttributes (HtmlTextWriter writer)
{
+#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID, Value);
+#endif
writer.WriteAttribute ("value", Value);
Attributes.Remove ("value");
base.RenderAttributes (writer);
: base (type)
{
}
-
+
[MonoTODO ("why our own version?")]
void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
{
}
+#if NET_2_0
+ protected internal override void Render (HtmlTextWriter writer)
+ {
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+ base.Render (writer);
+ }
+#endif
+
#if NET_2_0
protected internal
#else
protected override void RenderAttributes (HtmlTextWriter w)
{
+#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+#endif
/* If there is no "name" attribute,
* LoadPostData doesn't work...
*/
int count = items.Count;
for (int i = 0; i < count; i++) {
ListItem item = items[i];
-
w.Indent++;
/* Write the <option> elements this
protected override void RenderAttributes (HtmlTextWriter writer)
{
+#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+#endif
if (Attributes ["name"] == null) {
writer.WriteAttribute ("name", Name);
}
protected internal override void RenderContents (HtmlTextWriter writer)
{
int idx = 0;
+#if NET_2_0
+ bool havePage = Page != null;
+#endif
foreach (ListItem i in Items) {
+#if NET_2_0
+ if (havePage)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID, i.Value.ToString ());
+#endif
writer.RenderBeginTag (HtmlTextWriterTag.Li);
this.RenderBulletText (i, idx ++, writer);
writer.RenderEndTag ();
#endif
protected override void AddAttributesToRender (HtmlTextWriter writer) {
- if (Page != null)
+ if (Page != null) {
+#if NET_2_0
+ Page.ClientScript.RegisterForEventValidation (GetPostBackOptions ());
+#endif
Page.VerifyRenderingInServerForm (this);
-
+ }
+
#if NET_2_0
writer.AddAttribute (HtmlTextWriterAttribute.Type, UseSubmitBehavior ? "submit" : "button");
writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
protected internal
#else
protected
-#endif
+#endif
override void RenderContents (HtmlTextWriter writer)
- {
- }
-
+ {
+ }
+
[WebSysDescription ("")]
[WebCategory ("Action")]
- public event EventHandler Click
+ public event EventHandler Click
{
add {
Events.AddHandler (ClickEvent, value);
#endif
override void Render (HtmlTextWriter writer)
{
+#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+#endif
Table table = new Table ();
table.CellSpacing = CellSpacing;
table.CellPadding = CellPadding;
+2006-11-17 Marek Habersack <grendello@gmail.com>
+
+ * ImageButton.cs: Added support for event validation.
+
+ * ListBox.cs: Added support for event validation.
+
+ * Calendar.cs: Added support for event validation.
+
+ * DropDownList.cs: Added support for event validation.
+
+ * FormView.cs: Added support for event validation.
+
+ * RadioButtonList.cs: Added support for event validation.
+
+ * TextBox.cs: Added support for event validation.
+
+ * BulletedList.cs: Added support for event validation.
+
+ * CheckBox.cs: Added support for event validation.
+
+ * Button.cs: Added support for event validation.
+
2006-11-16 Igor Zelmanovich <igorz@mainsoft.com>
* CreateUserWizard.cs: fixed: ActiveStepIndex property.
#endif
override void Render (HtmlTextWriter w)
{
- if (Page != null)
+ if (Page != null) {
+#if NET_2_0
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+#endif
Page.VerifyRenderingInServerForm (this);
-
+ }
+
bool need_span = ControlStyleCreated && !ControlStyle.IsEmpty;
if (need_span)
ControlStyle.AddAttributesToRender (w, this);
for (int i = 0; i < count; i++) {
item = Items[i];
-
+#if NET_2_0
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID, item.Value.ToString ());
+#endif
writer.WriteBeginTag("option");
if (item.Selected) {
if (selected) {
\r
protected internal override void Render (HtmlTextWriter writer)\r
{\r
+#if NET_2_0\r
+ if (Page != null)\r
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);\r
+#endif\r
PrepareControlHierarchy ();\r
\r
if (table == null)\r
protected override void AddAttributesToRender (HtmlTextWriter writer)
{
- if (Page != null)
+ if (Page != null) {
+#if NET_2_0
+ Page.ClientScript.RegisterForEventValidation (GetPostBackOptions ());
+#endif
Page.VerifyRenderingInServerForm (this);
-
+ }
+
writer.AddAttribute (HtmlTextWriterAttribute.Type, "image");
writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
#if NET_2_0
#endif
override void RenderContents (HtmlTextWriter writer)
{
+#if NET_2_0
+ bool havePage = Page != null;
+#endif
foreach (ListItem item in Items) {
+#if NET_2_0
+ if (havePage)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID, item.Value.ToString ());
+#endif
writer.WriteBeginTag ("option");
if (item.Selected) {
writer.WriteAttribute ("selected", "selected", false);
override void Render (HtmlTextWriter writer)
{
#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+
if (Items.Count == 0)
return;
#endif
#endif
override void Render (HtmlTextWriter w)
{
+#if NET_2_0
+ if (Page != null)
+ Page.ClientScript.RegisterForEventValidation (this.UniqueID);
+#endif
// Why didn't msft just override RenderContents!?
RenderBeginTag (w);
if (TextMode == TextBoxMode.MultiLine)
+2006-11-17 Marek Habersack <grendello@gmail.com>
+
+ * PostBackOptions.cs: Renamed the constructors parameters to match
+ those Microsoft .NET uses.
+ targetControl must not be passed null to the constructor.
+
+ * ClientScriptManager.cs: Support for event validation.
+ Implemented a GetPostBackHyperlink overload.
+ Implemented the RegisterForEventValidation methods.
+ Implemented the ValidateEvent method.
+ Added support for saving/restoring event validation state.
+
+ * Page.cs: EnableEventValidation can be set only from the config
+ files (the <pages> element), the Page directive or from
+ Page_Init. After Page_Init returns, an exception is thrown.
+ Made GetFormatter internal, so that ClientScriptManager can use
+ it.
+ Added the internal LifeCycle property which contains the current
+ life cycle stage of the page request processing.
+ Added calls to save/restore event validation state.
+ Added checks for whether child controls of the page support event
+ validation or not.
+ Added calls to ClientScriptManager.ValidateEvent in appropriate
+ places.
+
+ * PageLifeCycle.cs: Added the PageLifeCycle enum, used in event
+ validation.
+
2006-11-16 Gonzalo Paniagua Javier <gonzalo@ximian.com>
* LosFormatter.cs:
using System;
using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#endif
using System.Text;
namespace System.Web.UI
ScriptEntry submitStatements;
ScriptEntry scriptIncludes;
Page page;
-
+#if NET_2_0
+ List <int> eventValidationValues;
+#endif
+
internal ClientScriptManager (Page page)
{
this.page = page;
return "javascript:" + GetPostBackEventReference (control, argument);
}
+#if NET_2_0
+ public string GetPostBackClientHyperlink (Control control, string argument, bool registerForEventValidation)
+ {
+ if (registerForEventValidation)
+ RegisterForEventValidation (control.UniqueID, argument);
+ return "javascript:" + GetPostBackEventReference (control, argument);
+ }
+#endif
+
public string GetPostBackEventReference (Control control, string argument)
{
page.RequiresPostBackScript ();
{
throw new NotImplementedException ();
}
-
- [MonoTODO]
+
+ // Implemented following the description in http://odetocode.com/Blogs/scott/archive/2006/03/20/3145.aspx
+ private int CalculateEventHash (string uniqueId, string argument)
+ {
+ int uniqueIdHash = uniqueId.GetHashCode ();
+ int argumentHash = (argument == null) ? 0 : argument.GetHashCode ();
+ return (uniqueIdHash ^ argumentHash);
+ }
+
public void RegisterForEventValidation (PostBackOptions options)
{
- throw new NotImplementedException ();
+ // MS.NET does not check for options == null, so we won't too...
+ RegisterForEventValidation (options.TargetControl.UniqueID, options.Argument);
}
- [MonoTODO]
public void RegisterForEventValidation (string uniqueId)
{
- throw new NotImplementedException ();
+ RegisterForEventValidation (uniqueId, null);
}
-
- [MonoTODO]
+
public void RegisterForEventValidation (string uniqueId, string argument)
{
- throw new NotImplementedException ();
+ if (!page.EnableEventValidation)
+ return;
+ if (uniqueId == null || uniqueId.Length == 0)
+ return;
+ if (page.LifeCycle < PageLifeCycle.Render)
+ throw new InvalidOperationException ("RegisterForEventValidation may only be called from the Render method");
+ if (eventValidationValues == null)
+ eventValidationValues = new List <int> ();
+
+
+ int hash = CalculateEventHash (uniqueId, argument);
+ if (eventValidationValues.BinarySearch (hash) < 0)
+ eventValidationValues.Add (hash);
}
- [MonoTODO]
public void ValidateEvent (string uniqueId)
{
- throw new NotImplementedException ();
+ ValidateEvent (uniqueId, null);
}
- [MonoTODO]
public void ValidateEvent (string uniqueId, string argument)
{
- throw new NotImplementedException ();
+ if (uniqueId == null || uniqueId.Length == 0)
+ throw new ArgumentException ("must not be null or empty", "uniqueId");
+ if (!page.EnableEventValidation)
+ return;
+ if (eventValidationValues == null)
+ goto bad;
+
+ int hash = CalculateEventHash (uniqueId, argument);
+ if (eventValidationValues.BinarySearch (hash) < 0)
+ goto bad;
+ return;
+
+ bad:
+ throw new ArgumentException ("Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation=\"true\"/> in configuration or <%@ Page EnableEventValidation=\"true\" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.");
}
#endif
void WriteScripts (HtmlTextWriter writer, ScriptEntry scriptList)
scriptList = scriptList.Next;
}
}
+
+#if NET_2_0
+ internal void RestoreEventValidationState (string fieldValue)
+ {
+ if (!page.EnableEventValidation || fieldValue == null || fieldValue.Length == 0)
+ return;
+ LosFormatter fmt = page.GetFormatter ();
+ eventValidationValues = (List <int>)fmt.Deserialize (fieldValue);
+ }
+
+ internal void SaveEventValidationState ()
+ {
+ if (!page.EnableEventValidation || eventValidationValues == null || eventValidationValues.Count == 0)
+ return;
+ eventValidationValues.Sort ();
+ LosFormatter fmt = page.GetFormatter ();
+ RegisterHiddenField (EventStateFieldName, fmt.SerializeToBase64 (eventValidationValues));
+ }
+
+ internal string EventStateFieldName
+ {
+ get { return "__EVENTVALIDATION"; }
+ }
+#endif
internal void WriteHiddenFields (HtmlTextWriter writer)
{
public class Page : TemplateControl, IHttpHandler
{
#if NET_2_0
+ private PageLifeCycle _lifeCycle = PageLifeCycle.Unknown;
private bool _eventValidation = true;
#endif
private bool _viewState = true;
#if NET_2_0
public virtual bool EnableEventValidation {
get { return _eventValidation; }
- set { _eventValidation = value;}
+ set {
+ if (_lifeCycle > PageLifeCycle.Init)
+ throw new InvalidOperationException ("The 'EnableEventValidation' property can be set only in the Page_init, the Page directive or in the <pages> configuration section.");
+ _eventValidation = value;
+ }
+ }
+
+ internal PageLifeCycle LifeCycle {
+ get { return _lifeCycle; }
}
#endif
scriptManager.WriteClientScriptBlocks (writer);
}
- LosFormatter GetFormatter ()
+ internal LosFormatter GetFormatter ()
{
#if NET_2_0
PagesSection config = (PagesSection) WebConfigurationManager.GetSection ("system.web/pages");
if (!postBackScriptRendered && requiresPostBackScript)
RenderPostBackScript (writer, formUniqueID);
-
+
+#if NET_2_0
+ scriptManager.SaveEventValidationState ();
+#endif
scriptManager.WriteHiddenFields (writer);
scriptManager.WriteClientScriptIncludes (writer);
scriptManager.WriteStartupScriptBlocks (writer);
public void ProcessRequest (HttpContext context)
#endif
{
+#if NET_2_0
+ _lifeCycle = PageLifeCycle.Unknown;
+#endif
_context = context;
if (clientTarget != null)
Request.ClientTarget = clientTarget;
throw;
} finally {
try {
+#if NET_2_0
+ _lifeCycle = PageLifeCycle.Unload;
+#endif
RenderTrace ();
UnloadRecursive (true);
+#if NET_2_0
+ _lifeCycle = PageLifeCycle.End;
+#endif
} catch {}
if (Thread.CurrentThread.CurrentCulture.Equals (culture) == false)
Thread.CurrentThread.CurrentCulture = culture;
_requestValueCollection = this.DeterminePostBackMode();
#if NET_2_0
+ _lifeCycle = PageLifeCycle.Start;
// http://msdn2.microsoft.com/en-us/library/ms178141.aspx
if (_requestValueCollection != null) {
if (!isCrossPagePostBack && _requestValueCollection [PreviousPageID] != null && _requestValueCollection [PreviousPageID] != Request.FilePath) {
}
}
+ _lifeCycle = PageLifeCycle.PreInit;
OnPreInit (EventArgs.Empty);
InitializeTheme ();
ApplyMasterPage ();
+ _lifeCycle = PageLifeCycle.Init;
#endif
Trace.Write ("aspx.page", "Begin Init");
InitRecursive (null);
Trace.Write ("aspx.page", "End Init");
#if NET_2_0
+ _lifeCycle = PageLifeCycle.InitComplete;
OnInitComplete (EventArgs.Empty);
#endif
renderingForm = false;
#if NET_2_0
if (IsPostBack || IsCallback) {
+ _lifeCycle = PageLifeCycle.PreLoad;
+ if (_requestValueCollection != null)
+ scriptManager.RestoreEventValidationState (_requestValueCollection [scriptManager.EventStateFieldName]);
#else
if (IsPostBack) {
#endif
#if NET_2_0
OnPreLoad (EventArgs.Empty);
+ _lifeCycle = PageLifeCycle.Load;
#endif
LoadRecursive ();
#if NET_2_0
if (IsPostBack || IsCallback) {
+ _lifeCycle = PageLifeCycle.ControlEvents;
#else
if (IsPostBack) {
#endif
}
#if NET_2_0
+ _lifeCycle = PageLifeCycle.LoadComplete;
OnLoadComplete (EventArgs.Empty);
if (IsCrossPagePostBack)
callbackOutput.Flush ();
return;
}
+
+ _lifeCycle = PageLifeCycle.PreRender;
#endif
Trace.Write ("aspx.page", "Begin PreRender");
Trace.Write ("aspx.page", "End SaveViewState");
#if NET_2_0
+ _lifeCycle = PageLifeCycle.SaveStateComplete;
OnSaveStateComplete (EventArgs.Empty);
+ _lifeCycle = PageLifeCycle.Render;
#endif
//--
}
}
+#if NET_2_0
+ bool CheckForValidationSupport (Control targetControl)
+ {
+ if (targetControl == null)
+ return false;
+ Type type = targetControl.GetType ();
+ object[] attributes = type.GetCustomAttributes (true);
+ foreach (object attr in attributes)
+ if (attr is SupportsEventValidationAttribute)
+ return true;
+ return false;
+ }
+#endif
+
void RaisePostBackEvents ()
{
+#if NET_2_0
+ Control targetControl;
+#endif
if (requiresRaiseEvent != null) {
+#if NET_2_0
+ targetControl = requiresRaiseEvent as Control;
+ if (targetControl != null && CheckForValidationSupport (targetControl))
+ scriptManager.ValidateEvent (targetControl.UniqueID, null);
+#endif
RaisePostBackEvent (requiresRaiseEvent, null);
return;
}
return;
}
+#if NET_2_0
+ targetControl = FindControl (eventTarget);
+ IPostBackEventHandler target = targetControl as IPostBackEventHandler;
+#else
IPostBackEventHandler target = FindControl (eventTarget) as IPostBackEventHandler;
+#endif
+
if (target == null)
return;
string eventArgument = postdata [postEventArgumentID];
+#if NET_2_0
+ if (CheckForValidationSupport (targetControl))
+ scriptManager.ValidateEvent (targetControl.UniqueID, eventArgument);
+#endif
RaisePostBackEvent (target, eventArgument);
}
if (callbackTarget == null || callbackTarget.Length == 0)
throw new HttpException ("Callback target not provided.");
- ICallbackEventHandler target = FindControl (callbackTarget) as ICallbackEventHandler;
+ Control targetControl = FindControl (callbackTarget);
+ ICallbackEventHandler target = targetControl as ICallbackEventHandler;
if (target == null)
throw new HttpException (string.Format ("Invalid callback target '{0}'.", callbackTarget));
string callbackArgument = _requestValueCollection [CallbackArgumentID];
+ if (CheckForValidationSupport (targetControl))
+ scriptManager.ValidateEvent (targetControl.UniqueID, callbackArgument);
target.RaiseCallbackEvent (callbackArgument);
return target.GetCallbackResult ();
}
--- /dev/null
+//
+// System.Web.Compilation.PageLifeCycle
+//
+// Authors:
+// Marek Habersack (grendello@gmail.com)
+//
+// (C) 2006 Marek Habersack
+//
+
+//
+// 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.
+//
+#if NET_2_0
+internal enum PageLifeCycle
+{
+ Unknown = 1,
+ Start,
+ PreInit,
+ Init,
+ InitComplete,
+ PreLoad,
+ Load,
+ ControlEvents,
+ LoadComplete,
+ PreRender,
+ SaveStateComplete,
+ Render,
+ Unload,
+ End
+}
+#endif
private bool performValidation;
private string validationGroup;
- public PostBackOptions (Control control)
- : this (control, null, null, false, false, false, true, false, null)
+ public PostBackOptions (Control targetControl)
+ : this (targetControl, null, null, false, false, false, true, false, null)
{
}
- public PostBackOptions (Control control, string argument)
- : this (control, argument, null, false, false, false, true, false, null)
+ public PostBackOptions (Control targetControl, string argument)
+ : this (targetControl, argument, null, false, false, false, true, false, null)
{
}
- public PostBackOptions (Control control, string argument, string actionUrl, bool isAutoPostBack,
- bool isJavaScriptProtocolRequired, bool isTrackFocus, bool isClientSubmit,
- bool isValidationPerformed, string validatingGroup)
+ public PostBackOptions (Control targetControl, string argument, string actionUrl, bool autoPostBack,
+ bool requiresJavaScriptProtocol, bool trackFocus, bool clientSubmit,
+ bool performValidation, string validationGroup)
{
- this.control = control;
+ if (targetControl == null)
+ throw new ArgumentNullException ("targetControl");
+ this.control = targetControl;
this.argument = argument;
this.actionUrl = actionUrl;
- this.autoPostBack = isAutoPostBack;
- this.requiresJavaScriptProtocol = isJavaScriptProtocolRequired;
- this.trackFocus = isTrackFocus;
- this.clientSubmit = isClientSubmit;
- this.performValidation = isValidationPerformed;
- this.validationGroup = validatingGroup;
+ this.autoPostBack = autoPostBack;
+ this.requiresJavaScriptProtocol = requiresJavaScriptProtocol;
+ this.trackFocus = trackFocus;
+ this.clientSubmit = clientSubmit;
+ this.performValidation = performValidation;
+ this.validationGroup = validationGroup;
}
[DefaultValue ("")]
System.Web.UI/OutputCacheParameters.cs
System.Web.UI/Page.cs
System.Web.UI/PageHandlerFactory.cs
+System.Web.UI/PageLifeCycle.cs
System.Web.UI/PageParser.cs
System.Web.UI/PageStatePersister.cs
System.Web.UI/PageTheme.cs