/// <summary> /// Binds the model to a value by using the specified controller context and binding context. /// </summary> /// <returns> /// The bound value. /// </returns> /// <param name = "controllerContext">The controller context.</param> /// <param name = "bindingContext">The binding context.</param> public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var collectionType = bindingContext.ModelType; var collectionEntityType = collectionType.GetGenericArguments().First(); var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult == null) { return(base.BindModel(controllerContext, bindingContext)); } var rawValue = valueProviderResult.RawValue as string[]; var countOfEntityIds = rawValue.Length; var entities = Array.CreateInstance(collectionEntityType, countOfEntityIds); var entityInterfaceType = collectionEntityType.GetInterfaces().First( interfaceType => interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IEntityWithTypedId <>)); var idType = entityInterfaceType.GetGenericArguments().First(); for (var i = 0; i < countOfEntityIds; i++) { var rawId = rawValue[i]; if (string.IsNullOrEmpty(rawId)) { return(null); } var typedId = (idType == typeof(Guid)) ? new Guid(rawId) : Convert.ChangeType(rawId, idType); var entity = EntityRetriever.GetEntityFor(collectionEntityType, typedId, idType); entities.SetValue(entity, i); } // base.BindModel(controllerContext, bindingContext); return(entities); }
/// <summary> /// Binds the model value to an entity by using the specified controller context and binding context. /// </summary> /// <returns> /// The bound value. /// </returns> /// <param name = "controllerContext">The controller context.</param> /// <param name = "bindingContext">The binding context.</param> public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var modelType = bindingContext.ModelType; // Will look for the entity Id either named "ModelName" or "ModelName.Id" var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName) ?? bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Id"); if (valueProviderResult == null) { return(base.BindModel(controllerContext, bindingContext)); } var entityInterfaceType = modelType.GetInterfaces().First( interfaceType => interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IEntityWithTypedId <>)); var idType = entityInterfaceType.GetGenericArguments().First(); var rawId = (valueProviderResult.RawValue as string[]).First(); if (string.IsNullOrEmpty(rawId)) { return(null); } try { var typedId = (idType == typeof(Guid)) ? new Guid(rawId) : Convert.ChangeType(rawId, idType); return(EntityRetriever.GetEntityFor(modelType, typedId, idType)); } catch (Exception) { // If the Id conversion failed for any reason, just return null return(null); } }