Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / UI / WebControls / DataSourceHelper.cs / 1305376 / DataSourceHelper.cs
#if ORYX_VNEXT
namespace Microsoft.Web.Data.UI.WebControls {
#else
namespace System.Web.UI.WebControls {
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web;
using System.Linq;
using System.Web.Compilation;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Resources;
using System.Globalization;
internal static class DataSourceHelper {
public static object SaveViewState(ParameterCollection parameters) {
if (parameters != null) {
return ((IStateManager)parameters).SaveViewState();
}
return null;
}
public static void TrackViewState(ParameterCollection parameters) {
if (parameters != null) {
((IStateManager)parameters).TrackViewState();
}
}
public static IDictionary ToDictionary(this ParameterCollection parameters, HttpContext context, Control control) {
return ToDictionary(parameters.GetValues(context, control));
}
internal static IDictionary ToDictionary(this IOrderedDictionary parameterValues) {
Dictionary values = new Dictionary(parameterValues.Count, StringComparer.OrdinalIgnoreCase);
foreach (DictionaryEntry entry in parameterValues) {
values[(string)entry.Key] = entry.Value;
}
return values;
}
public static IOrderedDictionary ToCaseInsensitiveDictionary(this IDictionary dictionary) {
if (dictionary != null) {
IOrderedDictionary destination = new OrderedDictionary(dictionary.Count, StringComparer.OrdinalIgnoreCase);
foreach (DictionaryEntry de in dictionary) {
destination[de.Key] = de.Value;
}
return destination;
}
return null;
}
internal static object CreateObjectInstance(Type type) {
// FastCreatePublicInstance is faster than Activator.CreateInstance since it caches the type factories.
#if !ORYX_VNEXT
return HttpRuntime.FastCreatePublicInstance(type);
#else
return Activator.CreateInstance(type);
#endif
}
public static bool MergeDictionaries(object dataObjectType, ParameterCollection referenceValues, IDictionary source,
IDictionary destination, IDictionary validationErrors) {
return MergeDictionaries(dataObjectType, referenceValues, source, destination, null, validationErrors);
}
public static bool MergeDictionaries(object dataObjectType, ParameterCollection reference, IDictionary source,
IDictionary destination, IDictionary destinationCopy, IDictionary validationErrors) {
if (source != null) {
foreach (DictionaryEntry de in source) {
object value = de.Value;
// search for a parameter that corresponds to this dictionary entry.
Parameter referenceParameter = null;
string parameterName = (string)de.Key;
foreach (Parameter p in reference) {
if (String.Equals(p.Name, parameterName, StringComparison.OrdinalIgnoreCase)) {
referenceParameter = p;
break;
}
}
// use the parameter for type conversion, default value and/or converting empty string to null.
if (referenceParameter != null) {
try {
value = referenceParameter.GetValue(value, true);
}
catch (Exception e) {
// catch conversion exceptions so they can be handled. Note that conversion throws various
// types of exceptions like InvalidCastException, FormatException, OverflowException, etc.
validationErrors[referenceParameter.Name] = e;
}
}
// save the value to the merged dictionaries.
destination[parameterName] = value;
if (destinationCopy != null) {
destinationCopy[parameterName] = value;
}
}
}
return validationErrors.Count == 0;
}
public static Type GetType(string typeName) {
return BuildManager.GetType(typeName, true /* throwOnError */, true /* ignoreCase */);
}
private static object ConvertType(object value, Type type, string paramName) {
// NOTE: This method came from ObjectDataSource with no changes made.
string s = value as string;
if (s != null) {
// Get the type converter for the destination type
TypeConverter converter = TypeDescriptor.GetConverter(type);
if (converter != null) {
// Perform the conversion
try {
value = converter.ConvertFromString(s);
}
catch (NotSupportedException) {
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, typeof(string).FullName,
type.FullName));
}
catch (FormatException) {
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, typeof(string).FullName,
type.FullName));
}
}
}
return value;
}
public static object BuildDataObject(Type dataObjectType, IDictionary inputParameters, IDictionary validationErrors) {
object dataObject = CreateObjectInstance(dataObjectType);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dataObject);
foreach (DictionaryEntry de in inputParameters) {
string propName = (de.Key == null ? String.Empty : de.Key.ToString());
PropertyDescriptor property = props.Find(propName, /*ignoreCase*/true);
// NOTE: No longer throws when a property is not found or is read only. This makes
// Delete, Insert and Update operations more optimistic, allowing scenarios such as:
// 1) Deletes and Updates after projecting data in the Selecting event.
// 2) Deletes and Updates after selecting children of the data object type in the
// Selecting event.
if ((property != null) && (!property.IsReadOnly)) {
try {
object value = BuildObjectValue(de.Value, property.PropertyType, propName);
property.SetValue(dataObject, value);
}
catch (Exception e) {
validationErrors[property.Name] = e;
}
}
}
if (validationErrors.Any()) {
return null;
}
return dataObject;
}
internal static object BuildObjectValue(object value, Type destinationType, string paramName) {
// NOTE: This method came from ObjectDataSource with no changes made.
// Only consider converting the type if the value is non-null and the types don't match
if ((value != null) && (!destinationType.IsInstanceOfType(value))) {
Type innerDestinationType = destinationType;
bool isNullable = false;
if (destinationType.IsGenericType &&
(destinationType.GetGenericTypeDefinition() == typeof(Nullable<>))) {
innerDestinationType = destinationType.GetGenericArguments()[0];
isNullable = true;
}
else {
if (destinationType.IsByRef) {
innerDestinationType = destinationType.GetElementType();
}
}
// Try to convert from for example string to DateTime, so that
// afterwards we can convert DateTime to Nullable
// If the value is a string, we attempt to use a TypeConverter to convert it
value = ConvertType(value, innerDestinationType, paramName);
// Special-case the value when the destination is Nullable
if (isNullable) {
Type paramValueType = value.GetType();
if (innerDestinationType != paramValueType) {
// Throw if for example, we are trying to convert from int to Nullable
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, paramValueType.FullName,
String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>",
destinationType.GetGenericArguments()[0].FullName)));
}
}
}
return value;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
#if ORYX_VNEXT
namespace Microsoft.Web.Data.UI.WebControls {
#else
namespace System.Web.UI.WebControls {
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web;
using System.Linq;
using System.Web.Compilation;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Resources;
using System.Globalization;
internal static class DataSourceHelper {
public static object SaveViewState(ParameterCollection parameters) {
if (parameters != null) {
return ((IStateManager)parameters).SaveViewState();
}
return null;
}
public static void TrackViewState(ParameterCollection parameters) {
if (parameters != null) {
((IStateManager)parameters).TrackViewState();
}
}
public static IDictionary ToDictionary(this ParameterCollection parameters, HttpContext context, Control control) {
return ToDictionary(parameters.GetValues(context, control));
}
internal static IDictionary ToDictionary(this IOrderedDictionary parameterValues) {
Dictionary values = new Dictionary(parameterValues.Count, StringComparer.OrdinalIgnoreCase);
foreach (DictionaryEntry entry in parameterValues) {
values[(string)entry.Key] = entry.Value;
}
return values;
}
public static IOrderedDictionary ToCaseInsensitiveDictionary(this IDictionary dictionary) {
if (dictionary != null) {
IOrderedDictionary destination = new OrderedDictionary(dictionary.Count, StringComparer.OrdinalIgnoreCase);
foreach (DictionaryEntry de in dictionary) {
destination[de.Key] = de.Value;
}
return destination;
}
return null;
}
internal static object CreateObjectInstance(Type type) {
// FastCreatePublicInstance is faster than Activator.CreateInstance since it caches the type factories.
#if !ORYX_VNEXT
return HttpRuntime.FastCreatePublicInstance(type);
#else
return Activator.CreateInstance(type);
#endif
}
public static bool MergeDictionaries(object dataObjectType, ParameterCollection referenceValues, IDictionary source,
IDictionary destination, IDictionary validationErrors) {
return MergeDictionaries(dataObjectType, referenceValues, source, destination, null, validationErrors);
}
public static bool MergeDictionaries(object dataObjectType, ParameterCollection reference, IDictionary source,
IDictionary destination, IDictionary destinationCopy, IDictionary validationErrors) {
if (source != null) {
foreach (DictionaryEntry de in source) {
object value = de.Value;
// search for a parameter that corresponds to this dictionary entry.
Parameter referenceParameter = null;
string parameterName = (string)de.Key;
foreach (Parameter p in reference) {
if (String.Equals(p.Name, parameterName, StringComparison.OrdinalIgnoreCase)) {
referenceParameter = p;
break;
}
}
// use the parameter for type conversion, default value and/or converting empty string to null.
if (referenceParameter != null) {
try {
value = referenceParameter.GetValue(value, true);
}
catch (Exception e) {
// catch conversion exceptions so they can be handled. Note that conversion throws various
// types of exceptions like InvalidCastException, FormatException, OverflowException, etc.
validationErrors[referenceParameter.Name] = e;
}
}
// save the value to the merged dictionaries.
destination[parameterName] = value;
if (destinationCopy != null) {
destinationCopy[parameterName] = value;
}
}
}
return validationErrors.Count == 0;
}
public static Type GetType(string typeName) {
return BuildManager.GetType(typeName, true /* throwOnError */, true /* ignoreCase */);
}
private static object ConvertType(object value, Type type, string paramName) {
// NOTE: This method came from ObjectDataSource with no changes made.
string s = value as string;
if (s != null) {
// Get the type converter for the destination type
TypeConverter converter = TypeDescriptor.GetConverter(type);
if (converter != null) {
// Perform the conversion
try {
value = converter.ConvertFromString(s);
}
catch (NotSupportedException) {
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, typeof(string).FullName,
type.FullName));
}
catch (FormatException) {
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, typeof(string).FullName,
type.FullName));
}
}
}
return value;
}
public static object BuildDataObject(Type dataObjectType, IDictionary inputParameters, IDictionary validationErrors) {
object dataObject = CreateObjectInstance(dataObjectType);
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dataObject);
foreach (DictionaryEntry de in inputParameters) {
string propName = (de.Key == null ? String.Empty : de.Key.ToString());
PropertyDescriptor property = props.Find(propName, /*ignoreCase*/true);
// NOTE: No longer throws when a property is not found or is read only. This makes
// Delete, Insert and Update operations more optimistic, allowing scenarios such as:
// 1) Deletes and Updates after projecting data in the Selecting event.
// 2) Deletes and Updates after selecting children of the data object type in the
// Selecting event.
if ((property != null) && (!property.IsReadOnly)) {
try {
object value = BuildObjectValue(de.Value, property.PropertyType, propName);
property.SetValue(dataObject, value);
}
catch (Exception e) {
validationErrors[property.Name] = e;
}
}
}
if (validationErrors.Any()) {
return null;
}
return dataObject;
}
internal static object BuildObjectValue(object value, Type destinationType, string paramName) {
// NOTE: This method came from ObjectDataSource with no changes made.
// Only consider converting the type if the value is non-null and the types don't match
if ((value != null) && (!destinationType.IsInstanceOfType(value))) {
Type innerDestinationType = destinationType;
bool isNullable = false;
if (destinationType.IsGenericType &&
(destinationType.GetGenericTypeDefinition() == typeof(Nullable<>))) {
innerDestinationType = destinationType.GetGenericArguments()[0];
isNullable = true;
}
else {
if (destinationType.IsByRef) {
innerDestinationType = destinationType.GetElementType();
}
}
// Try to convert from for example string to DateTime, so that
// afterwards we can convert DateTime to Nullable
// If the value is a string, we attempt to use a TypeConverter to convert it
value = ConvertType(value, innerDestinationType, paramName);
// Special-case the value when the destination is Nullable
if (isNullable) {
Type paramValueType = value.GetType();
if (innerDestinationType != paramValueType) {
// Throw if for example, we are trying to convert from int to Nullable
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
AtlasWeb.LinqDataSourceView_CannotConvertType, paramName, paramValueType.FullName,
String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>",
destinationType.GetGenericArguments()[0].FullName)));
}
}
}
return value;
}
}
}
// 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
- TypefaceMetricsCache.cs
- IndicShape.cs
- HttpServerProtocol.cs
- OutputCacheProfileCollection.cs
- FontNamesConverter.cs
- XmlWhitespace.cs
- ResolveCriteriaCD1.cs
- behaviorssection.cs
- WebPartCollection.cs
- TemplateXamlParser.cs
- FormViewCommandEventArgs.cs
- IPAddressCollection.cs
- Crypto.cs
- SystemParameters.cs
- IMembershipProvider.cs
- UserPreference.cs
- FlowNode.cs
- SymmetricCryptoHandle.cs
- DateTimeValueSerializer.cs
- Point3DCollectionConverter.cs
- BlockUIContainer.cs
- WorkflowMarkupSerializer.cs
- KeyedCollection.cs
- TCPClient.cs
- BrowserCapabilitiesFactory.cs
- PropertyGridView.cs
- TypeResolvingOptionsAttribute.cs
- ResourceIDHelper.cs
- VirtualDirectoryMappingCollection.cs
- CorrelationExtension.cs
- mactripleDES.cs
- ResourceIDHelper.cs
- CuspData.cs
- EntityClassGenerator.cs
- Debugger.cs
- RuntimeEnvironment.cs
- EntityTypeBase.cs
- VSWCFServiceContractGenerator.cs
- AccessControlList.cs
- UniqueIdentifierService.cs
- AlgoModule.cs
- ScrollChrome.cs
- OperationAbortedException.cs
- oledbconnectionstring.cs
- ValidationUtility.cs
- ValueType.cs
- EntityParameterCollection.cs
- XmlRawWriter.cs
- AsyncDataRequest.cs
- TdsParameterSetter.cs
- followingquery.cs
- PointAnimationUsingPath.cs
- ApplicationCommands.cs
- DocumentSchemaValidator.cs
- columnmapfactory.cs
- _Win32.cs
- FSWPathEditor.cs
- BinaryNode.cs
- PathParser.cs
- Rethrow.cs
- DESCryptoServiceProvider.cs
- DrawingImage.cs
- CalendarDateChangedEventArgs.cs
- SerializableAttribute.cs
- InvokeHandlers.cs
- ScriptingSectionGroup.cs
- TimeZoneInfo.cs
- SQLInt64.cs
- PassportAuthentication.cs
- CustomExpression.cs
- TabControlCancelEvent.cs
- ServiceModelInstallComponent.cs
- SupportsEventValidationAttribute.cs
- JsonReader.cs
- DeferrableContentConverter.cs
- DragEventArgs.cs
- VectorValueSerializer.cs
- TextRunCache.cs
- DrawingCollection.cs
- Image.cs
- ParameterRefs.cs
- PageSetupDialog.cs
- LicenseContext.cs
- Hashtable.cs
- CompilerInfo.cs
- ValidatedControlConverter.cs
- SqlServices.cs
- Encoder.cs
- TypeConverterAttribute.cs
- PeerInvitationResponse.cs
- DataObject.cs
- AnimationLayer.cs
- WindowsToolbar.cs
- SqlDependencyUtils.cs
- ExtensionQuery.cs
- EntityViewContainer.cs
- TextEditorMouse.cs
- ElementUtil.cs
- ViewCellRelation.cs
- _ProxyRegBlob.cs