//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
namespace System.Web.Configuration {
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Web.Compilation;
using System.Web.UI;
using System.Web.Util;
using System.Xml;
/*
*/
public sealed class PagesSection : ConfigurationSection {
private static readonly Version _controlRenderingDefaultVersion = VersionUtil.FrameworkDefault;
private static readonly Version _controlRenderingMinimumVersion = VersionUtil.Framework35;
private static ConfigurationPropertyCollection _properties;
private static readonly ConfigurationProperty _propBuffer =
new ConfigurationProperty("buffer", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propControlRenderingCompatibilityVersion =
new ConfigurationProperty("controlRenderingCompatibilityVersion",
typeof(Version),
_controlRenderingDefaultVersion,
StdValidatorsAndConverters.VersionConverter, //typeConverter
new VersionValidator(_controlRenderingMinimumVersion), //baseValidator
ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propEnableSessionState =
new ConfigurationProperty("enableSessionState", typeof(string), "true", ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propEnableViewState =
new ConfigurationProperty("enableViewState", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propEnableViewStateMac =
new ConfigurationProperty("enableViewStateMac", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propEnableEventValidation =
new ConfigurationProperty("enableEventValidation", typeof(bool), Page.EnableEventValidationDefault, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propSmartNavigation =
new ConfigurationProperty("smartNavigation", typeof(bool), false, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propAutoEventWireup =
new ConfigurationProperty("autoEventWireup", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propPageBaseType =
new ConfigurationProperty("pageBaseType", typeof(string), "System.Web.UI.Page", ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propUserControlBaseType =
new ConfigurationProperty("userControlBaseType", typeof(string), "System.Web.UI.UserControl", ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propValidateRequest =
new ConfigurationProperty("validateRequest", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propMasterPageFile =
new ConfigurationProperty("masterPageFile", typeof(string), String.Empty, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propTheme =
new ConfigurationProperty("theme", typeof(string), String.Empty, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propNamespaces =
new ConfigurationProperty("namespaces", typeof(NamespaceCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
private static readonly ConfigurationProperty _propControls =
new ConfigurationProperty("controls", typeof(TagPrefixCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
private static readonly ConfigurationProperty _propTagMapping =
new ConfigurationProperty("tagMapping", typeof(TagMapCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
private static readonly ConfigurationProperty _propMaxPageStateFieldLength =
new ConfigurationProperty("maxPageStateFieldLength", typeof(int), Page.DefaultMaxPageStateFieldLength, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propCompilationMode =
new ConfigurationProperty("compilationMode", typeof(CompilationMode), CompilationMode.Always, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propStyleSheetTheme =
new ConfigurationProperty("styleSheetTheme", typeof(string), String.Empty, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propPageParserFilterType =
new ConfigurationProperty("pageParserFilterType", typeof(string), String.Empty, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propViewStateEncryptionMode =
new ConfigurationProperty("viewStateEncryptionMode", typeof(ViewStateEncryptionMode), ViewStateEncryptionMode.Auto, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propMaintainScrollPosition =
new ConfigurationProperty("maintainScrollPositionOnPostBack", typeof(bool), false, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propAsyncTimeout =
new ConfigurationProperty("asyncTimeout",
typeof(TimeSpan),
TimeSpan.FromSeconds((double)Page.DefaultAsyncTimeoutSeconds),
StdValidatorsAndConverters.TimeSpanSecondsConverter,
StdValidatorsAndConverters.PositiveTimeSpanValidator,
ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propRenderAllHiddenFieldsAtTopOfForm =
new ConfigurationProperty("renderAllHiddenFieldsAtTopOfForm", typeof(bool), true, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propClientIDMode =
new ConfigurationProperty("clientIDMode", typeof(ClientIDMode), ClientIDMode.Predictable, ConfigurationPropertyOptions.None);
private static readonly ConfigurationProperty _propIgnoreDeviceFilters =
new ConfigurationProperty("ignoreDeviceFilters", typeof(IgnoreDeviceFilterElementCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);
private VirtualPath _virtualPath;
private string _masterPageFile;
private Type _pageBaseType;
private Type _userControlBaseType;
private Type _pageParserFilterType;
private bool _themeChecked;
private bool _styleSheetThemeChecked;
private ClientIDMode? _clientIDMode;
private Version _controlRenderingCompatibilityVersion;
//
private TagNamespaceRegisterEntryTable _tagNamespaceRegisterEntries;
//
private Hashtable _userControlRegisterEntries;
static PagesSection() {
// Property initialization
_properties = new ConfigurationPropertyCollection();
_properties.Add(_propBuffer);
_properties.Add(_propControlRenderingCompatibilityVersion);
_properties.Add(_propEnableSessionState);
_properties.Add(_propEnableViewState);
_properties.Add(_propEnableViewStateMac);
_properties.Add(_propEnableEventValidation);
_properties.Add(_propSmartNavigation);
_properties.Add(_propAutoEventWireup);
_properties.Add(_propPageBaseType);
_properties.Add(_propUserControlBaseType);
_properties.Add(_propValidateRequest);
_properties.Add(_propMasterPageFile);
_properties.Add(_propTheme);
_properties.Add(_propStyleSheetTheme);
_properties.Add(_propNamespaces);
_properties.Add(_propControls);
_properties.Add(_propTagMapping);
_properties.Add(_propMaxPageStateFieldLength);
_properties.Add(_propCompilationMode);
_properties.Add(_propPageParserFilterType);
_properties.Add(_propViewStateEncryptionMode);
_properties.Add(_propMaintainScrollPosition);
_properties.Add(_propAsyncTimeout);
_properties.Add(_propRenderAllHiddenFieldsAtTopOfForm);
_properties.Add(_propClientIDMode);
_properties.Add(_propIgnoreDeviceFilters);
}
public PagesSection() {
}
/*
protected override void InitializeDefault()
{
/* No Init Basic Map
Controls.Add(new TagPrefixInfo("asp", "System.Web.UI.WebControls.WebParts",
"System.Web, Version="+ThisAssembly.Version+", Culture=neutral, PublicKeyToken="+AssemblyRef.MicrosoftPublicKey,
null, null));
*/
/*
}
*/
protected override ConfigurationPropertyCollection Properties {
get {
return _properties;
}
}
[ConfigurationProperty("buffer", DefaultValue = true)]
public bool Buffer {
get {
return (bool)base[_propBuffer];
}
set {
base[_propBuffer] = value;
}
}
[ConfigurationProperty("enableSessionState", DefaultValue = "true")]
public PagesEnableSessionState EnableSessionState {
get { // note that the values of true and false are True and False
// in the enum and need to be true and false in the file
// so we cannot simple use the values from the enum
// "true" and "false" are not legal values for the enum
// since they are part of the language
PagesEnableSessionState temp = PagesEnableSessionState.True;
switch ((string)base[_propEnableSessionState]) {
case "true":
temp = PagesEnableSessionState.True;
break;
case "false":
temp = PagesEnableSessionState.False;
break;
case "ReadOnly":
temp = PagesEnableSessionState.ReadOnly;
break;
default:
// throw here cause this is a bad value
string PropName = _propEnableSessionState.Name;
string LegalValues = "true, false, ReadOnly";
throw new ConfigurationErrorsException(SR.GetString(SR.Invalid_enum_attribute, PropName, LegalValues));
}
return (PagesEnableSessionState)temp;
}
set {
string tempStr = "true";
switch (value) {
case PagesEnableSessionState.True:
tempStr = "true";
break;
case PagesEnableSessionState.False:
tempStr = "false";
break;
case PagesEnableSessionState.ReadOnly:
tempStr = "ReadOnly";
break;
default:
tempStr = "true";
break;
}
base[_propEnableSessionState] = tempStr;
}
}
[ConfigurationProperty("enableViewState", DefaultValue = true)]
public bool EnableViewState {
get {
return (bool)base[_propEnableViewState];
}
set {
base[_propEnableViewState] = value;
}
}
[ConfigurationProperty("enableViewStateMac", DefaultValue = true)]
public bool EnableViewStateMac {
get {
return (bool)base[_propEnableViewStateMac];
}
set {
base[_propEnableViewStateMac] = value;
}
}
[ConfigurationProperty("enableEventValidation", DefaultValue = Page.EnableEventValidationDefault)]
public bool EnableEventValidation {
get {
return (bool)base[_propEnableEventValidation];
}
set {
base[_propEnableEventValidation] = value;
}
}
[ConfigurationProperty("smartNavigation", DefaultValue = false)]
public bool SmartNavigation {
get {
return (bool)base[_propSmartNavigation];
}
set {
base[_propSmartNavigation] = value;
}
}
[ConfigurationProperty("autoEventWireup", DefaultValue = true)]
public bool AutoEventWireup {
get {
return (bool)base[_propAutoEventWireup];
}
set {
base[_propAutoEventWireup] = value;
}
}
[ConfigurationProperty("maintainScrollPositionOnPostBack", DefaultValue = false)]
public bool MaintainScrollPositionOnPostBack {
get {
return (bool)base[_propMaintainScrollPosition];
}
set {
base[_propMaintainScrollPosition] = value;
}
}
[ConfigurationProperty("pageBaseType", DefaultValue = "System.Web.UI.Page")]
public string PageBaseType {
get {
return (string)base[_propPageBaseType];
}
set {
base[_propPageBaseType] = value;
}
}
[ConfigurationProperty("userControlBaseType", DefaultValue = "System.Web.UI.UserControl")]
public string UserControlBaseType {
get {
return (string)base[_propUserControlBaseType];
}
set {
base[_propUserControlBaseType] = value;
}
}
internal Type PageBaseTypeInternal {
get {
if (_pageBaseType == null &&
ElementInformation.Properties[_propPageBaseType.Name].ValueOrigin != PropertyValueOrigin.Default) {
lock (this) {
if (_pageBaseType == null) {
Type pageBaseType = ConfigUtil.GetType(PageBaseType, "pageBaseType", this);
ConfigUtil.CheckBaseType(typeof(System.Web.UI.Page), pageBaseType, "pageBaseType", this);
_pageBaseType = pageBaseType;
}
}
}
return _pageBaseType;
}
}
internal Type UserControlBaseTypeInternal {
get {
if (_userControlBaseType == null &&
ElementInformation.Properties[_propUserControlBaseType.Name].ValueOrigin != PropertyValueOrigin.Default) {
lock (this) {
if (_userControlBaseType == null) {
Type userControlBaseType = ConfigUtil.GetType(
UserControlBaseType,
"userControlBaseType",
this);
ConfigUtil.CheckBaseType(typeof(System.Web.UI.UserControl),
userControlBaseType,
"userControlBaseType",
this);
_userControlBaseType = userControlBaseType;
}
}
}
return _userControlBaseType;
}
}
[ConfigurationProperty("pageParserFilterType", DefaultValue = "")]
public string PageParserFilterType {
get {
return (string)base[_propPageParserFilterType];
}
set {
base[_propPageParserFilterType] = value;
}
}
internal Type PageParserFilterTypeInternal {
get {
if (PageParser.DefaultPageParserFilterType != null) {
return PageParser.DefaultPageParserFilterType;
}
// If pageParserFilterType is an empty string, we treat this as meaning 'no filter',
// possibly overriding one specified on a parent web.config
if (_pageParserFilterType == null && !String.IsNullOrEmpty(PageParserFilterType)) {
Type pageParserFilterType = ConfigUtil.GetType(PageParserFilterType, "pageParserFilterType", this);
ConfigUtil.CheckBaseType(typeof(PageParserFilter), pageParserFilterType, "pageParserFilterType", this);
_pageParserFilterType = pageParserFilterType;
}
return _pageParserFilterType;
}
}
internal PageParserFilter CreateControlTypeFilter() {
Type pageParserFilterType = PageParserFilterTypeInternal;
// If no filter type is registered, return null
if (pageParserFilterType == null)
return null;
// Create an instance of the filter
return (PageParserFilter)HttpRuntime.CreateNonPublicInstance(pageParserFilterType);
}
[ConfigurationProperty("validateRequest", DefaultValue = true)]
public bool ValidateRequest {
get {
return (bool)base[_propValidateRequest];
}
set {
base[_propValidateRequest] = value;
}
}
[ConfigurationProperty("masterPageFile", DefaultValue = "")]
public string MasterPageFile {
get {
return (string)base[_propMasterPageFile];
}
set {
base[_propMasterPageFile] = value;
}
}
internal string MasterPageFileInternal {
get {
if (_masterPageFile == null) {
String masterPageFile = MasterPageFile;
if (!String.IsNullOrEmpty(masterPageFile)) {
if (UrlPath.IsAbsolutePhysicalPath(masterPageFile)) {
throw new ConfigurationErrorsException(
SR.GetString(SR.Physical_path_not_allowed, masterPageFile),
ElementInformation.Properties["masterPageFile"].Source,
ElementInformation.Properties["masterPageFile"].LineNumber);
}
VirtualPath masterPageVirtualPath;
try {
masterPageVirtualPath = VirtualPath.CreateNonRelative(masterPageFile);
}
catch (Exception ex) {
throw new ConfigurationErrorsException(ex.Message, ex,
ElementInformation.Properties["masterPageFile"].Source,
ElementInformation.Properties["masterPageFile"].LineNumber);
}
if (!Util.VirtualFileExistsWithAssert(masterPageVirtualPath)) {
throw new ConfigurationErrorsException(
SR.GetString(SR.FileName_does_not_exist, masterPageFile),
ElementInformation.Properties["masterPageFile"].Source,
ElementInformation.Properties["masterPageFile"].LineNumber);
}
string extension = UrlPath.GetExtension(masterPageFile);
Type buildProviderType =
CompilationUtil.GetBuildProviderTypeFromExtension(_virtualPath, extension, BuildProviderAppliesTo.Web, false);
if (!typeof(MasterPageBuildProvider).IsAssignableFrom(buildProviderType)) {
throw new ConfigurationErrorsException(
SR.GetString(SR.Bad_masterPage_ext),
ElementInformation.Properties["masterPageFile"].Source,
ElementInformation.Properties["masterPageFile"].LineNumber);
}
// Convert it to appRelative format
masterPageFile = masterPageVirtualPath.AppRelativeVirtualPathString;
}
else {
masterPageFile = String.Empty;
}
_masterPageFile = masterPageFile;
}
return _masterPageFile;
}
}
[ConfigurationProperty("theme", DefaultValue = "")]
public string Theme {
get {
return (string)base[_propTheme];
}
set {
base[_propTheme] = value;
}
}
internal string ThemeInternal {
get {
string themeName = Theme;
if (!_themeChecked) {
if ((!String.IsNullOrEmpty(themeName)) && (!Util.ThemeExists(themeName))) {
throw new ConfigurationErrorsException(
SR.GetString(SR.Page_theme_not_found, themeName),
ElementInformation.Properties["theme"].Source,
ElementInformation.Properties["theme"].LineNumber);
}
_themeChecked = true;
}
return themeName;
}
}
[ConfigurationProperty("styleSheetTheme", DefaultValue = "")]
public string StyleSheetTheme {
get {
return (string)base[_propStyleSheetTheme];
}
set {
base[_propStyleSheetTheme] = value;
}
}
internal string StyleSheetThemeInternal {
get {
string styleSheetThemeName = StyleSheetTheme;
if (!_styleSheetThemeChecked) {
if (!String.IsNullOrEmpty(styleSheetThemeName) &&
(!Util.ThemeExists(styleSheetThemeName))) {
throw new ConfigurationErrorsException(
SR.GetString(SR.Page_theme_not_found, styleSheetThemeName),
ElementInformation.Properties["styleSheetTheme"].Source,
ElementInformation.Properties["styleSheetTheme"].LineNumber);
}
_styleSheetThemeChecked = true;
}
return styleSheetThemeName;
}
}
[ConfigurationProperty("namespaces")]
public NamespaceCollection Namespaces {
get {
return (NamespaceCollection)base[_propNamespaces];
}
}
[ConfigurationProperty("controls")]
public TagPrefixCollection Controls {
get {
return (TagPrefixCollection)base[_propControls];
}
}
[ConfigurationProperty("maxPageStateFieldLength", DefaultValue = -1)]
public int MaxPageStateFieldLength {
get {
return (int)base[_propMaxPageStateFieldLength];
}
set {
base[_propMaxPageStateFieldLength] = value;
}
}
[ConfigurationProperty("tagMapping")]
public TagMapCollection TagMapping {
get {
return (TagMapCollection)base[_propTagMapping];
}
}
[ConfigurationProperty("compilationMode", DefaultValue = CompilationMode.Always)]
public CompilationMode CompilationMode {
get {
return (CompilationMode)base[_propCompilationMode];
}
set {
base[_propCompilationMode] = value;
}
}
[ConfigurationProperty("viewStateEncryptionMode", DefaultValue = ViewStateEncryptionMode.Auto)]
public ViewStateEncryptionMode ViewStateEncryptionMode {
get {
return (ViewStateEncryptionMode)base[_propViewStateEncryptionMode];
}
set {
base[_propViewStateEncryptionMode] = value;
}
}
[ConfigurationProperty("asyncTimeout", DefaultValue = "00:00:45")]
[TimeSpanValidator(MinValueString="00:00:00", MaxValueString=TimeSpanValidatorAttribute.TimeSpanMaxValue)]
[TypeConverter(typeof(TimeSpanSecondsConverter))]
public TimeSpan AsyncTimeout {
get {
return (TimeSpan)base[_propAsyncTimeout];
}
set {
base[_propAsyncTimeout] = value;
}
}
[ConfigurationProperty("renderAllHiddenFieldsAtTopOfForm", DefaultValue = true)]
public bool RenderAllHiddenFieldsAtTopOfForm {
get {
return (bool)base[_propRenderAllHiddenFieldsAtTopOfForm];
}
set {
base[_propRenderAllHiddenFieldsAtTopOfForm] = value;
}
}
[SuppressMessage("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase", MessageId="Member")]
[ConfigurationProperty("clientIDMode", DefaultValue = ClientIDMode.Predictable)]
public ClientIDMode ClientIDMode {
get {
if (_clientIDMode == null) {
_clientIDMode = (ClientIDMode)base[_propClientIDMode];
}
return (ClientIDMode)_clientIDMode;
}
set {
base[_propClientIDMode] = value;
_clientIDMode = value;
}
}
[ConfigurationProperty("controlRenderingCompatibilityVersion", DefaultValue = VersionUtil.FrameworkDefaultString)]
[ConfigurationValidator(typeof(VersionValidator))]
[TypeConverter(typeof(VersionConverter))]
public Version ControlRenderingCompatibilityVersion {
get {
if(_controlRenderingCompatibilityVersion == null) {
_controlRenderingCompatibilityVersion = (Version)base[_propControlRenderingCompatibilityVersion];
}
return _controlRenderingCompatibilityVersion;
}
set {
if (value == null) {
throw new ArgumentNullException("value");
}
base[_propControlRenderingCompatibilityVersion] = value;
_controlRenderingCompatibilityVersion = value;
}
}
[ConfigurationProperty("ignoreDeviceFilters")]
public IgnoreDeviceFilterElementCollection IgnoreDeviceFilters {
get {
return (IgnoreDeviceFilterElementCollection)base[_propIgnoreDeviceFilters];
}
}
internal TagNamespaceRegisterEntryTable TagNamespaceRegisterEntriesInternal {
get {
if (_tagNamespaceRegisterEntries == null) {
lock (this) {
if (_tagNamespaceRegisterEntries == null) {
FillInRegisterEntries();
}
}
}
return _tagNamespaceRegisterEntries;
}
}
internal void FillInRegisterEntries() {
//
TagNamespaceRegisterEntryTable tagNamespaceRegisterEntries = new TagNamespaceRegisterEntryTable();
foreach (TagNamespaceRegisterEntry entry in DefaultTagNamespaceRegisterEntries) {
tagNamespaceRegisterEntries[entry.TagPrefix] = new ArrayList(new object[] { entry });
}
Hashtable userControlRegisterEntries = new Hashtable(StringComparer.OrdinalIgnoreCase);
// Fill in the collection
foreach (TagPrefixInfo tpi in Controls) {
if (!String.IsNullOrEmpty(tpi.TagName)) {
UserControlRegisterEntry ucRegisterEntry = new UserControlRegisterEntry(tpi.TagPrefix, tpi.TagName);
ucRegisterEntry.ComesFromConfig = true;
try {
ucRegisterEntry.UserControlSource = VirtualPath.CreateNonRelative(tpi.Source);
}
catch (Exception e) {
throw new ConfigurationErrorsException(e.Message, e,
tpi.ElementInformation.Properties["src"].Source,
tpi.ElementInformation.Properties["src"].LineNumber);
}
userControlRegisterEntries[ucRegisterEntry.Key] = ucRegisterEntry;
}
else if (!String.IsNullOrEmpty(tpi.Namespace)) {
TagNamespaceRegisterEntry nsRegisterEntry = new TagNamespaceRegisterEntry(tpi.TagPrefix, tpi.Namespace, tpi.Assembly);
ArrayList entries = null;
entries = (ArrayList)tagNamespaceRegisterEntries[tpi.TagPrefix];
if (entries == null) {
entries = new ArrayList();
tagNamespaceRegisterEntries[tpi.TagPrefix] = entries;
}
entries.Add(nsRegisterEntry);
}
}
_tagNamespaceRegisterEntries = tagNamespaceRegisterEntries;
_userControlRegisterEntries = userControlRegisterEntries;
}
internal static ICollection DefaultTagNamespaceRegisterEntries {
get {
TagNamespaceRegisterEntry aspEntry = new TagNamespaceRegisterEntry("asp", "System.Web.UI.WebControls", AssemblyRef.SystemWeb);
TagNamespaceRegisterEntry mobileEntry = new TagNamespaceRegisterEntry("mobile", "System.Web.UI.MobileControls", AssemblyRef.SystemWebMobile);
return new TagNamespaceRegisterEntry[] { aspEntry, mobileEntry };
}
}
internal Hashtable UserControlRegisterEntriesInternal {
get {
if (_userControlRegisterEntries == null) {
lock (this) {
if (_userControlRegisterEntries == null) {
FillInRegisterEntries();
}
}
}
return _userControlRegisterEntries;
}
}
protected override void DeserializeSection(XmlReader reader) {
WebContext context;
base.DeserializeSection(reader);
// Determine hosting context
context = EvaluationContext.HostingContext as WebContext;
if (context != null) {
// Make sure it has a trailing slash as it is used as a base path to Combine with relative
_virtualPath = VirtualPath.CreateNonRelativeTrailingSlashAllowNull(context.Path);
}
}
// This is called as the last step of the deserialization process before the newly created section is seen by the consumer.
// We can use it to change defaults on-the-fly.
protected override void SetReadOnly() {
// Unless overridden, set
ConfigUtil.SetFX45DefaultValue(this, _propControlRenderingCompatibilityVersion, VersionUtil.Framework45);
base.SetReadOnly();
}
}
}