Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / DynamicData / DynamicData / EntityTemplateFactory.cs / 1305376 / EntityTemplateFactory.cs
using System.Diagnostics; using System.Globalization; using System.Web.Compilation; using System.Web.Hosting; using System.Web.UI.WebControls; namespace System.Web.DynamicData { public class EntityTemplateFactory { private const string s_defaultTemplateName = "Default"; private TemplateFactory _factory; private Func_templateInstantiator; public EntityTemplateFactory() : this(CreateEntityTemplateInstance, /* trackChanges */ true) { } // for unit testing internal EntityTemplateFactory(Func templateInstantiator, VirtualPathProvider vpp) : this(templateInstantiator, /* trackChanges */ false) { _factory.VirtualPathProvider = vpp; } private EntityTemplateFactory(Func templateInstantiator, bool trackChanges) { _factory = new TemplateFactory("EntityTemplates", trackChanges); _templateInstantiator = templateInstantiator; } internal string TemplateFolderVirtualPath { get { return _factory.TemplateFolderVirtualPath; } set { _factory.TemplateFolderVirtualPath = value; } } private static EntityTemplateUserControl CreateEntityTemplateInstance(string path) { return (EntityTemplateUserControl)BuildManager.CreateInstanceFromVirtualPath( path, typeof(EntityTemplateUserControl)); } public virtual EntityTemplateUserControl CreateEntityTemplate(MetaTable table, DataBoundControlMode mode, string uiHint) { if (table == null) { throw new ArgumentNullException("table"); } string entityTemplatePath = GetEntityTemplateVirtualPathWithCaching(table, mode, uiHint); if (entityTemplatePath == null) { return null; } return _templateInstantiator(entityTemplatePath); } private string GetEntityTemplateVirtualPathWithCaching(MetaTable table, DataBoundControlMode mode, string uiHint) { long cacheKey = Misc.CombineHashCodes(table, mode, uiHint); return _factory.GetTemplatePath(cacheKey, delegate() { return GetEntityTemplateVirtualPath(table, mode, uiHint); }); } public virtual string GetEntityTemplateVirtualPath(MetaTable table, DataBoundControlMode mode, string uiHint) { if (table == null) { throw new ArgumentNullException("table"); } // Fallback order is as follows (where CustomProducts is the uiHint) // CustomProducts_Insert // CustomProducts_Edit // Products_Insert // Products_Edit // Default_Insert // Default_Edit // CustomProducts_ReadOnly // Products_ReadOnly // Default_ReadOnly // // If nothing matches null is returned return GetVirtualPathFallback(table, mode, uiHint, DataBoundControlMode.Edit) ?? GetVirtualPathFallback(table, DataBoundControlMode.ReadOnly, uiHint, DataBoundControlMode.ReadOnly); } private string GetVirtualPathFallback(MetaTable table, DataBoundControlMode mode, string uiHint, DataBoundControlMode minModeToFallBack) { if (mode < minModeToFallBack) { return null; } // the strategy is to go over each candidate name and try to find an existing template for // each mode between 'mode' and 'minModeToFallBack' // note that GetVirtualPathForMode will return null for empty names (e.g. when the uiHint is not specified) string[] fallbackNames = new string[] { uiHint, table.Name, s_defaultTemplateName }; foreach (var name in fallbackNames) { for (var currentMode = mode; currentMode >= minModeToFallBack; currentMode--) { string virtualPath = GetVirtualPathForMode(name, currentMode); if (virtualPath != null) { return virtualPath; } } } return null; } private string GetVirtualPathForMode(string candidateName, DataBoundControlMode mode) { if (String.IsNullOrEmpty(candidateName)) { return null; } else { string templatePath = BuildEntityTemplateVirtualPath(candidateName, mode); return _factory.FileExists(templatePath) ? templatePath : null; } } public virtual string BuildEntityTemplateVirtualPath(string templateName, DataBoundControlMode mode) { if (templateName == null) { throw new ArgumentNullException("templateName"); } string modeString = mode == DataBoundControlMode.ReadOnly ? String.Empty : "_" + mode.ToString(); return String.Format(CultureInfo.InvariantCulture, this.TemplateFolderVirtualPath + "{0}{1}.ascx", templateName, modeString); } internal void Initialize(MetaModel model) { Debug.Assert(model != null); _factory.Model = model; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System.Diagnostics; using System.Globalization; using System.Web.Compilation; using System.Web.Hosting; using System.Web.UI.WebControls; namespace System.Web.DynamicData { public class EntityTemplateFactory { private const string s_defaultTemplateName = "Default"; private TemplateFactory _factory; private Func _templateInstantiator; public EntityTemplateFactory() : this(CreateEntityTemplateInstance, /* trackChanges */ true) { } // for unit testing internal EntityTemplateFactory(Func templateInstantiator, VirtualPathProvider vpp) : this(templateInstantiator, /* trackChanges */ false) { _factory.VirtualPathProvider = vpp; } private EntityTemplateFactory(Func templateInstantiator, bool trackChanges) { _factory = new TemplateFactory("EntityTemplates", trackChanges); _templateInstantiator = templateInstantiator; } internal string TemplateFolderVirtualPath { get { return _factory.TemplateFolderVirtualPath; } set { _factory.TemplateFolderVirtualPath = value; } } private static EntityTemplateUserControl CreateEntityTemplateInstance(string path) { return (EntityTemplateUserControl)BuildManager.CreateInstanceFromVirtualPath( path, typeof(EntityTemplateUserControl)); } public virtual EntityTemplateUserControl CreateEntityTemplate(MetaTable table, DataBoundControlMode mode, string uiHint) { if (table == null) { throw new ArgumentNullException("table"); } string entityTemplatePath = GetEntityTemplateVirtualPathWithCaching(table, mode, uiHint); if (entityTemplatePath == null) { return null; } return _templateInstantiator(entityTemplatePath); } private string GetEntityTemplateVirtualPathWithCaching(MetaTable table, DataBoundControlMode mode, string uiHint) { long cacheKey = Misc.CombineHashCodes(table, mode, uiHint); return _factory.GetTemplatePath(cacheKey, delegate() { return GetEntityTemplateVirtualPath(table, mode, uiHint); }); } public virtual string GetEntityTemplateVirtualPath(MetaTable table, DataBoundControlMode mode, string uiHint) { if (table == null) { throw new ArgumentNullException("table"); } // Fallback order is as follows (where CustomProducts is the uiHint) // CustomProducts_Insert // CustomProducts_Edit // Products_Insert // Products_Edit // Default_Insert // Default_Edit // CustomProducts_ReadOnly // Products_ReadOnly // Default_ReadOnly // // If nothing matches null is returned return GetVirtualPathFallback(table, mode, uiHint, DataBoundControlMode.Edit) ?? GetVirtualPathFallback(table, DataBoundControlMode.ReadOnly, uiHint, DataBoundControlMode.ReadOnly); } private string GetVirtualPathFallback(MetaTable table, DataBoundControlMode mode, string uiHint, DataBoundControlMode minModeToFallBack) { if (mode < minModeToFallBack) { return null; } // the strategy is to go over each candidate name and try to find an existing template for // each mode between 'mode' and 'minModeToFallBack' // note that GetVirtualPathForMode will return null for empty names (e.g. when the uiHint is not specified) string[] fallbackNames = new string[] { uiHint, table.Name, s_defaultTemplateName }; foreach (var name in fallbackNames) { for (var currentMode = mode; currentMode >= minModeToFallBack; currentMode--) { string virtualPath = GetVirtualPathForMode(name, currentMode); if (virtualPath != null) { return virtualPath; } } } return null; } private string GetVirtualPathForMode(string candidateName, DataBoundControlMode mode) { if (String.IsNullOrEmpty(candidateName)) { return null; } else { string templatePath = BuildEntityTemplateVirtualPath(candidateName, mode); return _factory.FileExists(templatePath) ? templatePath : null; } } public virtual string BuildEntityTemplateVirtualPath(string templateName, DataBoundControlMode mode) { if (templateName == null) { throw new ArgumentNullException("templateName"); } string modeString = mode == DataBoundControlMode.ReadOnly ? String.Empty : "_" + mode.ToString(); return String.Format(CultureInfo.InvariantCulture, this.TemplateFolderVirtualPath + "{0}{1}.ascx", templateName, modeString); } internal void Initialize(MetaModel model) { Debug.Assert(model != null); _factory.Model = model; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LinearGradientBrush.cs
- CatalogPartChrome.cs
- HtmlEmptyTagControlBuilder.cs
- CodeNamespace.cs
- WebPartAuthorizationEventArgs.cs
- LocalizationParserHooks.cs
- UTF8Encoding.cs
- DateTimeValueSerializerContext.cs
- CollectionTraceRecord.cs
- UIPropertyMetadata.cs
- PixelShader.cs
- CommonGetThemePartSize.cs
- OdbcPermission.cs
- FixedPageProcessor.cs
- CodeExporter.cs
- CollectionViewGroupInternal.cs
- PropertyEmitter.cs
- PrincipalPermission.cs
- NameValuePair.cs
- XmlUrlEditor.cs
- Trace.cs
- ConfigDefinitionUpdates.cs
- PropertyEmitter.cs
- ListControlDataBindingHandler.cs
- OleDbSchemaGuid.cs
- IPHostEntry.cs
- UInt64.cs
- GridViewRowCollection.cs
- CornerRadius.cs
- SecureEnvironment.cs
- WindowsToolbarItemAsMenuItem.cs
- Thickness.cs
- UInt16Converter.cs
- OutputCacheSection.cs
- VectorAnimationBase.cs
- TextBoxDesigner.cs
- ObjectResult.cs
- SqlClientFactory.cs
- AdobeCFFWrapper.cs
- ILGen.cs
- SrgsSemanticInterpretationTag.cs
- SetUserPreferenceRequest.cs
- Point3DAnimation.cs
- HighlightComponent.cs
- HitTestParameters3D.cs
- PropertyDescriptor.cs
- WebPartConnectionCollection.cs
- SslStreamSecurityBindingElement.cs
- ElementFactory.cs
- StickyNoteAnnotations.cs
- DataTable.cs
- SiteMapDesignerDataSourceView.cs
- MouseBinding.cs
- FastEncoder.cs
- ColumnTypeConverter.cs
- DBSqlParserColumn.cs
- WindowsRebar.cs
- PerspectiveCamera.cs
- JournalEntry.cs
- SafeProcessHandle.cs
- SerialStream.cs
- CultureInfoConverter.cs
- PaintEvent.cs
- SafeNativeMethods.cs
- Flattener.cs
- DataControlPagerLinkButton.cs
- BooleanExpr.cs
- Guid.cs
- SpellerInterop.cs
- HybridDictionary.cs
- WebBrowser.cs
- WCFModelStrings.Designer.cs
- InputLanguage.cs
- ExceptionTranslationTable.cs
- SafeRegistryKey.cs
- __Filters.cs
- SelectionGlyphBase.cs
- objectquery_tresulttype.cs
- CopyEncoder.cs
- ConnectionPool.cs
- XmlBindingWorker.cs
- Parameter.cs
- TextServicesDisplayAttribute.cs
- SiteOfOriginPart.cs
- LocatorPart.cs
- EventPrivateKey.cs
- StoreUtilities.cs
- EventMap.cs
- SiteMapDesignerDataSourceView.cs
- JsonReader.cs
- ClientUtils.cs
- ExpressionSelection.cs
- ProxyDataContractResolver.cs
- ProcessExitedException.cs
- ProjectionPlan.cs
- TextEndOfSegment.cs
- EditorReuseAttribute.cs
- RawStylusActions.cs
- XmlMtomWriter.cs
- ColumnMapTranslator.cs