public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { EnsureStackHelper.EnsureStack(); if (bindingContext == null) { throw new ArgumentNullException("bindingContext"); } bool performedFallback = false; if (!String.IsNullOrEmpty(bindingContext.ModelName) && !bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName)) { // We couldn't find any entry that began with the prefix. If this is the top-level element, fall back // to the empty prefix. if (bindingContext.FallbackToEmptyPrefix) { bindingContext = new ModelBindingContext() { ModelMetadata = bindingContext.ModelMetadata, ModelState = bindingContext.ModelState, PropertyFilter = bindingContext.PropertyFilter, ValueProvider = bindingContext.ValueProvider }; performedFallback = true; } else { return(null); } } // Simple model = int, string, etc.; determined by calling TypeConverter.CanConvertFrom(typeof(string)) // or by seeing if a value in the request exactly matches the name of the model we're binding. // Complex type = everything else. if (!performedFallback) { bool performRequestValidation = ShouldPerformRequestValidation(controllerContext, bindingContext); ValueProviderResult valueProviderResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation); if (valueProviderResult != null) { return(BindSimpleModel(controllerContext, bindingContext, valueProviderResult)); } } if (!bindingContext.ModelMetadata.IsComplexType) { return(null); } return(BindComplexModel(controllerContext, bindingContext)); }
/// <inheritdoc /> public sealed override object ReadInline(object item, ODataDeserializerContext readContext) { if (item == null) { throw Error.ArgumentNull("item"); } ODataEntryWithNavigationLinks entryWrapper = item as ODataEntryWithNavigationLinks; if (entryWrapper == null) { throw Error.Argument("item", SRResources.ArgumentMustBeOfType, typeof(ODataEntry).Name); } // Recursion guard to avoid stack overflows EnsureStackHelper.EnsureStack(); return(ReadEntry(entryWrapper, readContext)); }
/// <summary> /// Attempt to bind against the given ActionContext. /// </summary> /// <param name="actionContext">The action context.</param> /// <param name="bindingContext">The binding context.</param> /// <param name="binders">set of binders to use for binding</param> /// <returns>True if the bind was successful, else false.</returns> public static bool Bind(this HttpActionContext actionContext, ModelBindingContext bindingContext, IEnumerable <IModelBinder> binders) { if (actionContext == null) { throw Error.ArgumentNull("actionContext"); } if (bindingContext == null) { throw Error.ArgumentNull("bindingContext"); } // Protects against stack overflow for deeply nested model binding EnsureStackHelper.EnsureStack(); Type modelType = bindingContext.ModelType; HttpConfiguration config = actionContext.ControllerContext.Configuration; ModelBinderProvider providerFromAttr; if (ModelBindingHelper.TryGetProviderFromAttributes(modelType, out providerFromAttr)) { IModelBinder binder = providerFromAttr.GetBinder(config, modelType); if (binder != null) { return(binder.BindModel(actionContext, bindingContext)); } } foreach (IModelBinder binder in binders) { if (binder != null) { if (binder.BindModel(actionContext, bindingContext)) { return(true); } } } // Either we couldn't find a binder, or the binder couldn't bind. Distinction is not important. return(false); }
/// <inheritdoc /> public sealed override object ReadInline(object item, ODataDeserializerContext readContext) { if (item == null) { return(null); } ODataCollectionValue collection = item as ODataCollectionValue; if (collection == null) { throw Error.Argument("item", SRResources.ArgumentMustBeOfType, typeof(ODataCollectionValue).Name); } // Recursion guard to avoid stack overflows EnsureStackHelper.EnsureStack(); return(ReadCollectionValue(collection, readContext)); }
/// <summary> /// Override this method if you want to visit each query node. /// </summary> /// <remarks> /// This method is intended to be called from method overrides in subclasses. This method also supports unit-testing scenarios and is not intended to be called from user code. /// Call the Validate method to validate a <see cref="FilterQueryOption"/> instance. /// </remarks> /// <param name="node"></param> /// <param name="settings"></param> public virtual void ValidateQueryNode(QueryNode node, ODataValidationSettings settings) { // Recursion guard to avoid stack overflows EnsureStackHelper.EnsureStack(); SingleValueNode singleNode = node as SingleValueNode; CollectionNode collectionNode = node as CollectionNode; IncrementNodeCount(settings); if (singleNode != null) { ValidateSingleValueNode(singleNode, settings); } else if (collectionNode != null) { ValidateCollectionNode(collectionNode, settings); } }
/// <inheritdoc /> public sealed override object ReadInline(object item, ODataDeserializerContext readContext) { if (item == null) { return(null); } ODataFeedWithEntries feed = item as ODataFeedWithEntries; if (feed == null) { throw Error.Argument("item", SRResources.ArgumentMustBeOfType, typeof(ODataFeedWithEntries).Name); } // Recursion guard to avoid stack overflows EnsureStackHelper.EnsureStack(); return(ReadFeed(feed, readContext)); }