当我尝试使用以下两个属性绑定模型时,在模型绑定期间出现错误:
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;
}
}
错误:
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:
如果我将属性更改为基本自动属性:
public IEnumerable<Claimant> Drivers { get; set; }
public IEnumerable<Property> Vehicles { get; set; }
一切正常。
当设置器与自动属性设置器相同时,为什么模型绑定会出现问题?
编辑- 阅读默认模型绑定器源最终会导致您看到这一点,第一行是Clear()
针对属性调用的,所以当我返回时,Empty<T>
它显然不起作用。
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);
}
}
}