Model binding error with custom property getter
asp.net-mvc-3, c#
Solution
Try like this:
get
{
return _drivers ?? new List<Claimant>();
}
Problem
I have getting an error during the model bind when I use try to bind a model with these two properties: ``` private IEnumerable<Claimant> _drivers; public IEnumerable<Claimant> Drivers { get { return _drivers ?? Enumerable.Empty<Claimant>(); } set { _drivers = value; } } private IEnumerable<Property> _vehicles; public IEnumerable<Property> Vehicles { get { return _vehicles ?? Enumerable.Empty<Property>(); } set { _vehicles = value; } } ``` Error: ``` System.Reflection.TargetInvocationException was unhandled by user code Message=Exception has been thrown by the target of an invocation. Source=mscorlib StackTrace: <snip> InnerException: System.NotSupportedException Message=Collection is read-only. Source=mscorlib StackTrace: at System.SZArrayHelper.Clear[T]() at System.Web.Mvc.DefaultModelBinder.CollectionHelpers .ReplaceCollectionImpl[T](ICollection`1 collection, IEnumerable newContents) InnerException: ``` If I change the properties to basic auto properties: ``` public IEnumerable<Claimant> Drivers { get; set; } public IEnumerable<Property> Vehicles { get; set; } ``` Everything works fine. Why would the model binding have issues when the setters are the same as the auto property setters? Edit - Reading through the default model binder source eventually leads you to this, where the first line is calling `Clear()` against the property, so when I returned the `Empty<T>` it obviously is not going to work. ``` private static void ReplaceCollectionImpl<T>(ICollection<T> collection, IEnumerable newContents) { collection.Clear(); if (newContents != null) { foreach (object item in newContents) { // if the item was not a T, some conversion failed. the error message will be propagated, // but in the meanwhile we need to make a placeholder element in the array. T castItem = (item is T) ? (T)item : default(T); collection.Add(castItem); } } } ```