// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Mvc.ModelBinding { /// /// A context that contains operating information for model binding and validation. /// public class ModelBindingContext { private static readonly Predicate _defaultPropertyFilter = _ => true; private string _modelName; private ModelStateDictionary _modelState; private Dictionary _propertyMetadata; private ModelValidationNode _validationNode; private Predicate _propertyFilter; /// /// Initializes a new instance of the class. /// public ModelBindingContext() { } /// /// Initializes a new instance of the class using the /// . // /// /// This constructor copies certain values that won't change between parent and child objects, /// e.g. ValueProvider, ModelState /// public ModelBindingContext(ModelBindingContext bindingContext) { if (bindingContext != null) { ModelState = bindingContext.ModelState; ValueProvider = bindingContext.ValueProvider; MetadataProvider = bindingContext.MetadataProvider; ModelBinder = bindingContext.ModelBinder; ValidatorProvider = bindingContext.ValidatorProvider; HttpContext = bindingContext.HttpContext; } } /// /// Gets or sets the model associated with this context. /// /// /// The property must be set to access this property. /// public object Model { get { EnsureModelMetadata(); return ModelMetadata.Model; } set { EnsureModelMetadata(); ModelMetadata.Model = value; } } /// /// Gets or sets the metadata for the model associated with this context. /// public ModelMetadata ModelMetadata { get; set; } /// /// Gets or sets the name of the model. This property is used as a key for looking up values in /// during model binding. /// public string ModelName { get { if (_modelName == null) { _modelName = string.Empty; } return _modelName; } set { _modelName = value; } } /// /// Gets or sets the used to capture values /// for properties in the object graph of the model when binding. /// public ModelStateDictionary ModelState { get { if (_modelState == null) { _modelState = new ModelStateDictionary(); } return _modelState; } set { _modelState = value; } } /// /// Gets the type of the model. /// /// /// The property must be set to access this property. /// public Type ModelType { get { EnsureModelMetadata(); return ModelMetadata.ModelType; } } /// /// Gets or sets a value that indicates whether the binder should use an empty prefix to look up /// values in when no values are found using the /// prefix. /// public bool FallbackToEmptyPrefix { get; set; } /// /// Gets or sets the for the current request. /// public HttpContext HttpContext { get; set; } /// /// Gets or sets the associated with this context. /// public IValueProvider ValueProvider { get; set; } /// /// Gets or sets the associated with this context. /// public IModelBinder ModelBinder { get; set; } /// /// Gets or sets the associated with this context. /// public IModelMetadataProvider MetadataProvider { get; set; } /// /// Gets or sets the instance used for model validation with this /// context. /// public IModelValidatorProvider ValidatorProvider { get; set; } /// /// Gets a dictionary of property name to instances for /// /// public IDictionary PropertyMetadata { get { if (_propertyMetadata == null) { _propertyMetadata = ModelMetadata.Properties .ToDictionary(m => m.PropertyName, StringComparer.OrdinalIgnoreCase); } return _propertyMetadata; } } public Predicate PropertyFilter { get { if (_propertyFilter == null) { _propertyFilter = _defaultPropertyFilter; } return _propertyFilter; } set { _propertyFilter = value; } } /// /// Gets or sets the instance used as a container for /// validation information. /// public ModelValidationNode ValidationNode { get { if (_validationNode == null) { _validationNode = new ModelValidationNode(ModelMetadata, ModelName); } return _validationNode; } set { _validationNode = value; } } private void EnsureModelMetadata() { if (ModelMetadata == null) { throw new InvalidOperationException(Resources.ModelBindingContext_ModelMetadataMustBeSet); } } } }