Code:
/ DotNET / DotNET / 8.0 / untmp / Orcas / RTM / ndp / fx / src / xsp / System / Web / Extensions / ui / ScriptComponentDescriptor.cs / 1 / 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", "CA1706:ShortAcronymsShouldBeUppercase")] 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", "CA1706:ShortAcronymsShouldBeUppercase")] 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 = JavaScriptSerializer.CreateInstance(); } return _serializer; } } public string Type { get { return _type; } set { if (String.IsNullOrEmpty(value)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "value"); } _type = value; } } [SuppressMessage("Microsoft.Naming", "CA1706:ShortAcronymsShouldBeUppercase")] 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", "CA1706:ShortAcronymsShouldBeUppercase")] 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MenuItemBindingCollection.cs
- _IPv6Address.cs
- ButtonStandardAdapter.cs
- SubstitutionDesigner.cs
- DefaultSection.cs
- SharedHttpsTransportManager.cs
- ScalarType.cs
- TransformProviderWrapper.cs
- Condition.cs
- DBSqlParser.cs
- DbQueryCommandTree.cs
- BatchParser.cs
- FixedPosition.cs
- GetRecipientRequest.cs
- FaultPropagationRecord.cs
- MenuAdapter.cs
- CreateUserWizard.cs
- GenericWebPart.cs
- ExceptionTrace.cs
- AttachedPropertyBrowsableAttribute.cs
- SchemaMapping.cs
- SmiEventStream.cs
- MultiView.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- Rect3D.cs
- RequiredFieldValidator.cs
- SelectedDatesCollection.cs
- DependencyObjectValidator.cs
- Clause.cs
- XmlAutoDetectWriter.cs
- ApplicationInfo.cs
- TypeSystem.cs
- XmlHierarchyData.cs
- DirectoryNotFoundException.cs
- DataGridTableStyleMappingNameEditor.cs
- DbDeleteCommandTree.cs
- SafeNativeMethodsOther.cs
- DelayedRegex.cs
- StructuredTypeInfo.cs
- SystemIcmpV4Statistics.cs
- ReadOnlyAttribute.cs
- Focus.cs
- Regex.cs
- ObjectDataSourceChooseTypePanel.cs
- PerformanceCounterManager.cs
- _HTTPDateParse.cs
- PageThemeCodeDomTreeGenerator.cs
- MutexSecurity.cs
- KeyValueConfigurationElement.cs
- ToolTipService.cs
- BreakSafeBase.cs
- RegistrationServices.cs
- CommonEndpointBehaviorElement.cs
- Int16.cs
- XPathNavigatorReader.cs
- CardSpaceSelector.cs
- QueryStringHandler.cs
- GenericUI.cs
- StringUtil.cs
- ItemsControl.cs
- XPathException.cs
- DataContractSerializer.cs
- DictionaryKeyPropertyAttribute.cs
- TypeBrowserDialog.cs
- RSACryptoServiceProvider.cs
- TextServicesCompartment.cs
- SymmetricKeyWrap.cs
- _MultipleConnectAsync.cs
- System.Data.OracleClient_BID.cs
- sqlpipe.cs
- WebBrowserNavigatedEventHandler.cs
- XmlValueConverter.cs
- OdbcParameter.cs
- ManualResetEventSlim.cs
- AnnouncementClient.cs
- Region.cs
- DropShadowEffect.cs
- TabPanel.cs
- SchemaImporterExtensionsSection.cs
- ImageAutomationPeer.cs
- TypeInfo.cs
- PingOptions.cs
- NativeMethods.cs
- MULTI_QI.cs
- ScriptManagerProxy.cs
- PerformanceCounterCategory.cs
- ComAwareEventInfo.cs
- CultureSpecificStringDictionary.cs
- Permission.cs
- ResumeStoryboard.cs
- TextChange.cs
- AsyncResult.cs
- HealthMonitoringSection.cs
- SystemIPInterfaceProperties.cs
- DelegateSerializationHolder.cs
- ImageSourceValueSerializer.cs
- TabControl.cs
- CompressedStack.cs
- StringInfo.cs
- PropertyGridView.cs