public

  • Download Gist
CollectionsNotNullModelBinder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Web.Mvc;
 
namespace Core.Web.Mvc.ModelProviders
{
/// <summary>
/// http://lostechies.com/jimmybogard/2013/11/07/null-collectionsarrays-from-mvc-model-binding/
/// Fixed
/// </summary>
public class CollectionsNotNullModelBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
if (value == null)
{
if (propertyDescriptor.PropertyType.IsArray)
{
value = Array.CreateInstance(propertyDescriptor.PropertyType.GetElementType(), 0);
}
else if (propertyDescriptor.PropertyType.IsGenericType)
{
Type typeToCreate = null;
Type genericTypeDefinition = propertyDescriptor.PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(IDictionary<,>))
{
typeToCreate = typeof(Dictionary<,>).MakeGenericType(propertyDescriptor.PropertyType.GetGenericArguments());
}
else if (genericTypeDefinition == typeof(IEnumerable<>) ||
genericTypeDefinition == typeof(ICollection<>) ||
genericTypeDefinition == typeof(IList<>))
{
typeToCreate = typeof(List<>).MakeGenericType(propertyDescriptor.PropertyType.GetGenericArguments());
}
 
if (typeToCreate != null)
{
value = Activator.CreateInstance(typeToCreate);
}
}
}
 
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}
}
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.