Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / UI / MasterPage.cs / 1305376 / MasterPage.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* MasterPage class definition
*
* Copyright (c) 1998 Microsoft Corporation
*/
namespace System.Web.UI {
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Globalization;
using System.Security.Permissions;
using System.Reflection;
using System.Web.Hosting;
using System.Web.Compilation;
using System.Web.UI.WebControls;
using System.Web.Util;
public class MasterPageControlBuilder : UserControlControlBuilder {
internal static readonly String AutoTemplatePrefix = "Template_";
}
///
/// Default ControlBuilder used to parse master page files. Note that this class inherits from FileLevelPageControlBuilder
/// to reuse masterpage handling code.
///
public class FileLevelMasterPageControlBuilder: FileLevelPageControlBuilder {
internal override void AddContentTemplate(object obj, string templateName, ITemplate template) {
MasterPage master = (MasterPage)obj;
master.AddContentTemplate(templateName, template);
}
}
///
/// This class is not marked as abstract, because the VS designer
/// needs to instantiate it when opening .master files
///
[
Designer("Microsoft.VisualStudio.Web.WebForms.MasterPageWebFormDesigner, " + AssemblyRef.MicrosoftVisualStudioWeb, typeof(IRootDesigner)),
ControlBuilder(typeof(MasterPageControlBuilder)),
ParseChildren(false)
]
public class MasterPage : UserControl {
private VirtualPath _masterPageFile;
private MasterPage _master;
// The collection used to store the templates created on the content page.
private IDictionary _contentTemplates;
// The collection used to store the content templates defined in MasterPage.
private IDictionary _contentTemplateCollection;
private IList _contentPlaceHolders;
private bool _masterPageApplied;
// The page or masterpage that hosts this masterPage.
internal TemplateControl _ownerControl;
public MasterPage() {
}
///
/// Dictionary used to store the content templates that are passed in from the content pages.
///
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected internal IDictionary ContentTemplates {
get {
return _contentTemplates;
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected internal IList ContentPlaceHolders {
get {
if (_contentPlaceHolders == null) {
_contentPlaceHolders = new ArrayList();
}
return _contentPlaceHolders;
}
}
///
/// The MasterPage used by this nested MasterPage control.
///
[
Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
WebSysDescription(SR.MasterPage_MasterPage)
]
public MasterPage Master {
get {
if (_master == null && !_masterPageApplied) {
_master = MasterPage.CreateMaster(this, Context, _masterPageFile, _contentTemplateCollection);
}
return _master;
}
}
///
/// Gets and sets the masterPageFile of this control.
///
[
DefaultValue(""),
WebCategory("Behavior"),
WebSysDescription(SR.MasterPage_MasterPageFile)
]
public string MasterPageFile {
get {
return VirtualPath.GetVirtualPathString(_masterPageFile);
}
set {
if (_masterPageApplied) {
throw new InvalidOperationException(SR.GetString(SR.PropertySetBeforePageEvent, "MasterPageFile", "Page_PreInit"));
}
if (value != VirtualPath.GetVirtualPathString(_masterPageFile)) {
_masterPageFile = VirtualPath.CreateAllowNull(value);
if (_master != null && Controls.Contains(_master)) {
Controls.Remove(_master);
}
_master = null;
}
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected internal void AddContentTemplate(string templateName, ITemplate template) {
if (_contentTemplateCollection == null) {
_contentTemplateCollection = new Hashtable(10, StringComparer.OrdinalIgnoreCase);
}
try {
_contentTemplateCollection.Add(templateName, template);
}
catch (ArgumentException) {
throw new HttpException(SR.GetString(SR.MasterPage_Multiple_content, templateName));
}
}
internal static MasterPage CreateMaster(TemplateControl owner, HttpContext context,
VirtualPath masterPageFile, IDictionary contentTemplateCollection) {
Debug.Assert(owner is MasterPage || owner is Page);
MasterPage master = null;
if (masterPageFile == null) {
if (contentTemplateCollection != null && contentTemplateCollection.Count > 0) {
throw new HttpException(SR.GetString(SR.Content_only_allowed_in_content_page));
}
return null;
}
// If it's relative, make it *app* relative. Treat is as relative to this
// user control (ASURT 55513)
VirtualPath virtualPath = VirtualPathProvider.CombineVirtualPathsInternal(
owner.TemplateControlVirtualPath, masterPageFile);
// Compile the declarative control and get its Type
ITypedWebObjectFactory result = (ITypedWebObjectFactory)BuildManager.GetVPathBuildResult(
context, virtualPath);
// Make sure it has the correct base type
if (!typeof(MasterPage).IsAssignableFrom(result.InstantiatedType)) {
throw new HttpException(SR.GetString(SR.Invalid_master_base,
masterPageFile));
}
master = (MasterPage)result.CreateInstance();
master.TemplateControlVirtualPath = virtualPath;
if (owner.HasControls()) {
foreach (Control control in owner.Controls) {
LiteralControl literal = control as LiteralControl;
if (literal == null || Util.FirstNonWhiteSpaceIndex(literal.Text) >= 0) {
throw new HttpException(SR.GetString(SR.Content_allowed_in_top_level_only));
}
}
// Remove existing controls.
owner.Controls.Clear();
}
// Make sure the control collection is writable.
if (owner.Controls.IsReadOnly) {
throw new HttpException(SR.GetString(SR.MasterPage_Cannot_ApplyTo_ReadOnly_Collection));
}
if (contentTemplateCollection != null) {
foreach(String contentName in contentTemplateCollection.Keys) {
if (!master.ContentPlaceHolders.Contains(contentName.ToLower(CultureInfo.InvariantCulture))) {
throw new HttpException(SR.GetString(
SR.MasterPage_doesnt_have_contentplaceholder, contentName, masterPageFile));
}
}
master._contentTemplates = contentTemplateCollection;
}
master._ownerControl = owner;
master.InitializeAsUserControl(owner.Page);
owner.Controls.Add(master);
return master;
}
internal static void ApplyMasterRecursive(MasterPage master, IList appliedMasterFilePaths) {
Debug.Assert(appliedMasterFilePaths != null);
// Recursively apply master pages to the nested masterpages.
if (master.Master != null) {
string pageFile = master._masterPageFile.VirtualPathString.ToLower(CultureInfo.InvariantCulture);
if (appliedMasterFilePaths.Contains(pageFile)) {
throw new InvalidOperationException(SR.GetString(SR.MasterPage_Circular_Master_Not_Allowed, master._masterPageFile));
}
appliedMasterFilePaths.Add(pageFile);
ApplyMasterRecursive(master.Master, appliedMasterFilePaths);
}
master._masterPageApplied = true;
}
public void InstantiateInContentPlaceHolder(Control contentPlaceHolder, ITemplate template) {
HttpContext context = HttpContext.Current;
// Remember the old TemplateControl
TemplateControl oldControl = context.TemplateControl;
// Storing the template control into the context
// since each thread needs to set it differently.
context.TemplateControl = _ownerControl;
try {
// Instantiate the template using the correct TemplateControl
template.InstantiateIn(contentPlaceHolder);
}
finally {
// Revert back to the old templateControl
context.TemplateControl = oldControl;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XPathBinder.cs
- SiteMapNodeItemEventArgs.cs
- RequestSecurityToken.cs
- SHA256Managed.cs
- UpdatePanel.cs
- UrlPath.cs
- ColumnHeaderConverter.cs
- UIAgentAsyncEndRequest.cs
- DiscoveryDocumentSearchPattern.cs
- TextElementEnumerator.cs
- MediaPlayer.cs
- CharKeyFrameCollection.cs
- UriTemplateEquivalenceComparer.cs
- AvTrace.cs
- SQLInt64Storage.cs
- WebPartConnectionsEventArgs.cs
- ToolStripMenuItemCodeDomSerializer.cs
- TemplateApplicationHelper.cs
- SrgsOneOf.cs
- DoubleAnimationUsingKeyFrames.cs
- TTSVoice.cs
- IdentitySection.cs
- BaseDataBoundControl.cs
- DataStorage.cs
- QilReplaceVisitor.cs
- StylusLogic.cs
- mediaeventshelper.cs
- FilteredDataSetHelper.cs
- EtwProvider.cs
- HandleExceptionArgs.cs
- AnnotationAuthorChangedEventArgs.cs
- AutoGeneratedField.cs
- ListDataHelper.cs
- TraceContextRecord.cs
- CharacterBufferReference.cs
- ConditionCollection.cs
- TableStyle.cs
- ConnectionProviderAttribute.cs
- SqlCacheDependencySection.cs
- ClientSideQueueItem.cs
- StringBuilder.cs
- ReachIDocumentPaginatorSerializer.cs
- AttributeCollection.cs
- NullableConverter.cs
- BamlBinaryReader.cs
- TemplateApplicationHelper.cs
- DBConnectionString.cs
- entitydatasourceentitysetnameconverter.cs
- TypeUsageBuilder.cs
- DataGridToolTip.cs
- Focus.cs
- ImageIndexEditor.cs
- NetMsmqBindingElement.cs
- GlobalEventManager.cs
- ProtocolsConfigurationHandler.cs
- InsufficientMemoryException.cs
- TemplateComponentConnector.cs
- Triangle.cs
- TrackBar.cs
- RoutedEventHandlerInfo.cs
- columnmapkeybuilder.cs
- Splitter.cs
- DataGridViewCellValidatingEventArgs.cs
- TemplateBuilder.cs
- CapabilitiesSection.cs
- BackgroundFormatInfo.cs
- MetabaseServerConfig.cs
- GenericParameterDataContract.cs
- DrawingCollection.cs
- VariableExpressionConverter.cs
- SrgsElement.cs
- StylusShape.cs
- ScaleTransform3D.cs
- ConfigurationManagerInternalFactory.cs
- BooleanSwitch.cs
- WebBrowserSiteBase.cs
- RepeatInfo.cs
- CollectionViewProxy.cs
- TransportSecurityProtocolFactory.cs
- SystemInfo.cs
- ISO2022Encoding.cs
- WindowsEditBox.cs
- Soap12FormatExtensions.cs
- ApplicationBuildProvider.cs
- DataChangedEventManager.cs
- TypeUnloadedException.cs
- Timer.cs
- LoginUtil.cs
- Size3DConverter.cs
- IdentityManager.cs
- MediaCommands.cs
- ZoneIdentityPermission.cs
- UserControl.cs
- StylesEditorDialog.cs
- FtpCachePolicyElement.cs
- Attachment.cs
- Stroke2.cs
- ObjectDataSource.cs
- GeneratedContractType.cs
- DbProviderSpecificTypePropertyAttribute.cs