Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / xsp / System / Web / Extensions / ui / ScriptComponentDescriptor.cs / 2 / ScriptComponentDescriptor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Resources; using System.Web.Script.Serialization; [ AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) ] public class ScriptComponentDescriptor : ScriptDescriptor { // PERF: In the ScriptControl/Properties/Scenario.aspx perf test, SortedList is 2% faster than // SortedDictionary. private string _elementIDInternal; private SortedList_events; private string _id; private SortedList _properties; private bool _registerDispose = true; private JavaScriptSerializer _serializer; private string _type; public ScriptComponentDescriptor(string type) { if (String.IsNullOrEmpty(type)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "type"); } _type = type; } // Used by ScriptBehaviorDescriptor and ScriptControlDesriptor internal ScriptComponentDescriptor(string type, string elementID) : this(type) { if (String.IsNullOrEmpty(elementID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "elementID"); } _elementIDInternal = elementID; } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public virtual string ClientID { get { return ID; } } internal string ElementIDInternal { get { return _elementIDInternal; } } private SortedList Events { get { if (_events == null) { _events = new SortedList (StringComparer.Ordinal); } return _events; } } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public virtual string ID { get { return _id ?? String.Empty; } set { _id = value; } } private SortedList Properties { get { if (_properties == null) { _properties = new SortedList (StringComparer.Ordinal); } return _properties; } } internal bool RegisterDispose { get { return _registerDispose; } set { _registerDispose = value; } } private JavaScriptSerializer Serializer { get { if (_serializer == null) { _serializer = new JavaScriptSerializer(); } return _serializer; } } [SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods", Justification = "Refers to a script element, not to Object.GetType()")] public string Type { get { return _type; } set { if (String.IsNullOrEmpty(value)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "value"); } _type = value; } } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public void AddComponentProperty(string name, string componentID) { if (String.IsNullOrEmpty(componentID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "componentID"); } AddProperty(name, new ComponentReference(componentID)); } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public void AddElementProperty(string name, string elementID) { if (String.IsNullOrEmpty(elementID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "elementID"); } AddProperty(name, new ElementReference(elementID)); } public void AddEvent(string name, string handler) { if (String.IsNullOrEmpty(name)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name"); } if (String.IsNullOrEmpty(handler)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "handler"); } Events[name] = handler; } public void AddProperty(string name, object value) { AddProperty(name, new ObjectReference(value)); } private void AddProperty(string name, Expression value) { if (String.IsNullOrEmpty(name)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name"); } Debug.Assert(value != null); Properties[name] = value; } public void AddScriptProperty(string name, string script) { if (String.IsNullOrEmpty(script)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "script"); } AddProperty(name, new ScriptExpression(script)); } private void AppendEventsScript(StringBuilder builder) { // PERF: Use field directly to avoid creating Dictionary if not already created if (_events != null && _events.Count > 0) { builder.Append('{'); bool first = true; // Can't use JavaScriptSerializer directly on events dictionary, since the values are // JavaScript functions and should not be quoted. foreach (KeyValuePair e in _events) { if (first) { first = false; } else { builder.Append(','); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(e.Key)); builder.Append('"'); builder.Append(':'); builder.Append(e.Value); } builder.Append("}"); } else { builder.Append("null"); } } private void AppendPropertiesScript(StringBuilder builder) { bool first = true; // PERF: Use field directly to avoid creating Dictionary if not already created if (_properties != null && _properties.Count > 0) { foreach (KeyValuePair p in _properties) { if (p.Value.Type == ExpressionType.Script) { if (first) { builder.Append("{"); first = false; } else { builder.Append(","); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(p.Key)); builder.Append('"'); builder.Append(':'); p.Value.AppendValue(Serializer, builder); } } } if (first) { // If we didn't see any properties, append "null" builder.Append("null"); } else { // Else, close the JSON object builder.Append("}"); } } private void AppendReferencesScript(StringBuilder builder) { bool first = true; // PERF: Use field directly to avoid creating Dictionary if not already created if (_properties != null && _properties.Count > 0) { foreach (KeyValuePair p in _properties) { if (p.Value.Type == ExpressionType.ComponentReference) { if (first) { builder.Append("{"); first = false; } else { builder.Append(","); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(p.Key)); builder.Append('"'); builder.Append(':'); p.Value.AppendValue(Serializer, builder); } } } if (first) { // If we didn't see any references, append "null" builder.Append("null"); } else { // Else, close the JSON object builder.Append("}"); } } protected internal override string GetScript() { const string separator = ", "; if (!String.IsNullOrEmpty(ID)) { AddProperty("id", ID); } StringBuilder builder = new StringBuilder(); builder.Append("$create("); builder.Append(Type); builder.Append(separator); AppendPropertiesScript(builder); builder.Append(separator); AppendEventsScript(builder); builder.Append(separator); AppendReferencesScript(builder); if (ElementIDInternal != null) { builder.Append(separator); builder.Append("$get(\""); builder.Append(JavaScriptString.QuoteString(ElementIDInternal)); builder.Append("\")"); } builder.Append(");"); return builder.ToString(); } internal override void RegisterDisposeForDescriptor(ScriptManager scriptManager, Control owner) { if (RegisterDispose && scriptManager.SupportsPartialRendering) { // If partial rendering is supported, register a JavaScript statement // that will dispose this component if the UpdatePanel it is inside is // getting refreshed. Only components need this; controls are associated // with DOM elements so they get disposed through their 'dispose' expando. scriptManager.RegisterDispose(owner, "$find('" + ID + "').dispose();"); } } private abstract class Expression { public abstract ExpressionType Type { get; } public abstract void AppendValue(JavaScriptSerializer serializer, StringBuilder builder); } private enum ExpressionType { Script, ComponentReference } private sealed class ComponentReference : Expression { private string _componentID; public ComponentReference(string componentID) { _componentID = componentID; } public override ExpressionType Type { get { return ExpressionType.ComponentReference; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append('"'); builder.Append(JavaScriptString.QuoteString(_componentID)); builder.Append('"'); } } private sealed class ElementReference : Expression { private string _elementID; public ElementReference(string elementID) { _elementID = elementID; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append("$get(\""); builder.Append(JavaScriptString.QuoteString(_elementID)); builder.Append("\")"); } } private sealed class ObjectReference : Expression { private object _value; public ObjectReference(object value) { _value = value; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { // DevDiv Bugs 96574: pass SerializationFormat.JavaScript to serialize to straight JavaScript, // so date properties are rendered as dates serializer.Serialize(_value, builder, JavaScriptSerializer.SerializationFormat.JavaScript); } } private sealed class ScriptExpression : Expression { private string _script; public ScriptExpression(string script) { _script = script; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append(_script); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Resources; using System.Web.Script.Serialization; [ AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) ] public class ScriptComponentDescriptor : ScriptDescriptor { // PERF: In the ScriptControl/Properties/Scenario.aspx perf test, SortedList is 2% faster than // SortedDictionary. private string _elementIDInternal; private SortedList_events; private string _id; private SortedList _properties; private bool _registerDispose = true; private JavaScriptSerializer _serializer; private string _type; public ScriptComponentDescriptor(string type) { if (String.IsNullOrEmpty(type)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "type"); } _type = type; } // Used by ScriptBehaviorDescriptor and ScriptControlDesriptor internal ScriptComponentDescriptor(string type, string elementID) : this(type) { if (String.IsNullOrEmpty(elementID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "elementID"); } _elementIDInternal = elementID; } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public virtual string ClientID { get { return ID; } } internal string ElementIDInternal { get { return _elementIDInternal; } } private SortedList Events { get { if (_events == null) { _events = new SortedList (StringComparer.Ordinal); } return _events; } } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public virtual string ID { get { return _id ?? String.Empty; } set { _id = value; } } private SortedList Properties { get { if (_properties == null) { _properties = new SortedList (StringComparer.Ordinal); } return _properties; } } internal bool RegisterDispose { get { return _registerDispose; } set { _registerDispose = value; } } private JavaScriptSerializer Serializer { get { if (_serializer == null) { _serializer = new JavaScriptSerializer(); } return _serializer; } } [SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods", Justification = "Refers to a script element, not to Object.GetType()")] public string Type { get { return _type; } set { if (String.IsNullOrEmpty(value)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "value"); } _type = value; } } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public void AddComponentProperty(string name, string componentID) { if (String.IsNullOrEmpty(componentID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "componentID"); } AddProperty(name, new ComponentReference(componentID)); } [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] public void AddElementProperty(string name, string elementID) { if (String.IsNullOrEmpty(elementID)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "elementID"); } AddProperty(name, new ElementReference(elementID)); } public void AddEvent(string name, string handler) { if (String.IsNullOrEmpty(name)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name"); } if (String.IsNullOrEmpty(handler)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "handler"); } Events[name] = handler; } public void AddProperty(string name, object value) { AddProperty(name, new ObjectReference(value)); } private void AddProperty(string name, Expression value) { if (String.IsNullOrEmpty(name)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name"); } Debug.Assert(value != null); Properties[name] = value; } public void AddScriptProperty(string name, string script) { if (String.IsNullOrEmpty(script)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "script"); } AddProperty(name, new ScriptExpression(script)); } private void AppendEventsScript(StringBuilder builder) { // PERF: Use field directly to avoid creating Dictionary if not already created if (_events != null && _events.Count > 0) { builder.Append('{'); bool first = true; // Can't use JavaScriptSerializer directly on events dictionary, since the values are // JavaScript functions and should not be quoted. foreach (KeyValuePair e in _events) { if (first) { first = false; } else { builder.Append(','); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(e.Key)); builder.Append('"'); builder.Append(':'); builder.Append(e.Value); } builder.Append("}"); } else { builder.Append("null"); } } private void AppendPropertiesScript(StringBuilder builder) { bool first = true; // PERF: Use field directly to avoid creating Dictionary if not already created if (_properties != null && _properties.Count > 0) { foreach (KeyValuePair p in _properties) { if (p.Value.Type == ExpressionType.Script) { if (first) { builder.Append("{"); first = false; } else { builder.Append(","); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(p.Key)); builder.Append('"'); builder.Append(':'); p.Value.AppendValue(Serializer, builder); } } } if (first) { // If we didn't see any properties, append "null" builder.Append("null"); } else { // Else, close the JSON object builder.Append("}"); } } private void AppendReferencesScript(StringBuilder builder) { bool first = true; // PERF: Use field directly to avoid creating Dictionary if not already created if (_properties != null && _properties.Count > 0) { foreach (KeyValuePair p in _properties) { if (p.Value.Type == ExpressionType.ComponentReference) { if (first) { builder.Append("{"); first = false; } else { builder.Append(","); } builder.Append('"'); builder.Append(JavaScriptString.QuoteString(p.Key)); builder.Append('"'); builder.Append(':'); p.Value.AppendValue(Serializer, builder); } } } if (first) { // If we didn't see any references, append "null" builder.Append("null"); } else { // Else, close the JSON object builder.Append("}"); } } protected internal override string GetScript() { const string separator = ", "; if (!String.IsNullOrEmpty(ID)) { AddProperty("id", ID); } StringBuilder builder = new StringBuilder(); builder.Append("$create("); builder.Append(Type); builder.Append(separator); AppendPropertiesScript(builder); builder.Append(separator); AppendEventsScript(builder); builder.Append(separator); AppendReferencesScript(builder); if (ElementIDInternal != null) { builder.Append(separator); builder.Append("$get(\""); builder.Append(JavaScriptString.QuoteString(ElementIDInternal)); builder.Append("\")"); } builder.Append(");"); return builder.ToString(); } internal override void RegisterDisposeForDescriptor(ScriptManager scriptManager, Control owner) { if (RegisterDispose && scriptManager.SupportsPartialRendering) { // If partial rendering is supported, register a JavaScript statement // that will dispose this component if the UpdatePanel it is inside is // getting refreshed. Only components need this; controls are associated // with DOM elements so they get disposed through their 'dispose' expando. scriptManager.RegisterDispose(owner, "$find('" + ID + "').dispose();"); } } private abstract class Expression { public abstract ExpressionType Type { get; } public abstract void AppendValue(JavaScriptSerializer serializer, StringBuilder builder); } private enum ExpressionType { Script, ComponentReference } private sealed class ComponentReference : Expression { private string _componentID; public ComponentReference(string componentID) { _componentID = componentID; } public override ExpressionType Type { get { return ExpressionType.ComponentReference; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append('"'); builder.Append(JavaScriptString.QuoteString(_componentID)); builder.Append('"'); } } private sealed class ElementReference : Expression { private string _elementID; public ElementReference(string elementID) { _elementID = elementID; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append("$get(\""); builder.Append(JavaScriptString.QuoteString(_elementID)); builder.Append("\")"); } } private sealed class ObjectReference : Expression { private object _value; public ObjectReference(object value) { _value = value; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { // DevDiv Bugs 96574: pass SerializationFormat.JavaScript to serialize to straight JavaScript, // so date properties are rendered as dates serializer.Serialize(_value, builder, JavaScriptSerializer.SerializationFormat.JavaScript); } } private sealed class ScriptExpression : Expression { private string _script; public ScriptExpression(string script) { _script = script; } public override ExpressionType Type { get { return ExpressionType.Script; } } public override void AppendValue(JavaScriptSerializer serializer, StringBuilder builder) { builder.Append(_script); } } } } // 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
- NetCodeGroup.cs
- ItemAutomationPeer.cs
- Tile.cs
- PopOutPanel.cs
- ResourcesChangeInfo.cs
- ServiceModelConfiguration.cs
- MDIClient.cs
- TypeDefinition.cs
- DataListItemCollection.cs
- ObjectCloneHelper.cs
- DelegatedStream.cs
- WindowClosedEventArgs.cs
- GeometryModel3D.cs
- RequestTimeoutManager.cs
- DataServiceQueryContinuation.cs
- DataGridBoolColumn.cs
- OutputWindow.cs
- MediaCommands.cs
- XmlImplementation.cs
- XPathNodeList.cs
- GB18030Encoding.cs
- OptimalTextSource.cs
- HtmlControlPersistable.cs
- BooleanKeyFrameCollection.cs
- PassportIdentity.cs
- Int32Rect.cs
- XdrBuilder.cs
- XmlTextReader.cs
- InvokeDelegate.cs
- Array.cs
- CallbackValidator.cs
- PageBuildProvider.cs
- DataGridColumnDropSeparator.cs
- TextEndOfLine.cs
- DropSource.cs
- MappingModelBuildProvider.cs
- AnonymousIdentificationModule.cs
- LogEntrySerialization.cs
- BindableAttribute.cs
- XmlSchemaRedefine.cs
- future.cs
- JpegBitmapDecoder.cs
- GetCardDetailsRequest.cs
- ToolStripControlHost.cs
- OpenFileDialog.cs
- diagnosticsswitches.cs
- GeometryModel3D.cs
- XmlDataSourceNodeDescriptor.cs
- CollectionType.cs
- ConnectionInterfaceCollection.cs
- ObfuscateAssemblyAttribute.cs
- NamespaceDecl.cs
- WorkflowIdleBehavior.cs
- DragCompletedEventArgs.cs
- DesignerMetadata.cs
- ActivityBuilderXamlWriter.cs
- DeleteHelper.cs
- TransformationRules.cs
- SqlErrorCollection.cs
- SQLInt32Storage.cs
- ClientSettingsStore.cs
- WebPartTracker.cs
- EdmPropertyAttribute.cs
- InheritanceRules.cs
- ProxyManager.cs
- ProviderIncompatibleException.cs
- TriggerActionCollection.cs
- SQLChars.cs
- RangeValuePatternIdentifiers.cs
- DetailsViewModeEventArgs.cs
- DefaultHttpHandler.cs
- ICspAsymmetricAlgorithm.cs
- BufferAllocator.cs
- ConstraintConverter.cs
- DrawingAttributesDefaultValueFactory.cs
- SqlNode.cs
- GeneralTransform3DGroup.cs
- MatchAllMessageFilter.cs
- BlobPersonalizationState.cs
- DataGridBoolColumn.cs
- CommandLibraryHelper.cs
- DateTimeConstantAttribute.cs
- ZipIOModeEnforcingStream.cs
- InternalReceiveMessage.cs
- ParameterCollection.cs
- RemoteDebugger.cs
- Oid.cs
- QueryConverter.cs
- ViewSimplifier.cs
- SamlAuthenticationStatement.cs
- GenericIdentity.cs
- FormViewInsertedEventArgs.cs
- WebServiceData.cs
- Column.cs
- DataGridColumnCollection.cs
- UserControlDocumentDesigner.cs
- PathFigureCollection.cs
- HtmlFormParameterWriter.cs
- State.cs
- ProfilePropertyMetadata.cs