I get an error while binding the model when I try to bind the 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 changed the properties to basic automatic properties:
public IEnumerable<Claimant> Drivers { get; set; } public IEnumerable<Property> Vehicles { get; set; }
Everything is working fine.
Why does model binding have problems when setters are the same as auto networks?
Change Reading through the default binding source by default will eventually lead you to this, where the first line calls Clear() against the property, so when I returned Empty<T> , it obviously won't work.
private static void ReplaceCollectionImpl<T>(ICollection<T> collection, IEnumerable newContents) { collection.Clear(); if (newContents != null) { foreach (object item in newContents) {
source share