C# 自定义属性getter的模型绑定错误
当我尝试使用以下两个属性绑定模型时,在模型绑定过程中出现错误:C# 自定义属性getter的模型绑定错误,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,当我尝试使用以下两个属性绑定模型时,在模型绑定过程中出现错误: private IEnumerable<Claimant> _drivers; public IEnumerable<Claimant> Drivers { get { return _drivers ?? Enumerable.Empty<Claimant>(); } set
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;
}
}
public IEnumerable<Claimant> Drivers { get; set; }
public IEnumerable<Property> Vehicles { get; set; }
试着这样做:
get
{
return _drivers ?? new List<Claimant>();
}
get
{
返回_驱动程序??新列表();
}
在自定义getter中,我通常看到null合并运算符(??)用于在返回时设置私有支持字段:
private IEnumerable<Claimant> _drivers;
public IEnumerable<Claimant> Drivers
{
get
{
return _drivers ?? (_drivers = Enumerable.Empty<Claimant>());
}
set
{
_drivers = value;
}
}
IIRC
Enumerable.Empty
是一个静态只读可枚举文件,用于将空存储不可知的可枚举文件传递给方法。它不是用来作为空集合的“起点”。这很可能就是为什么会出现错误
选择一种存储机制(例如,列表
),并将其用作备份字段的类型。然后可以初始化它
private List<Claimant> _drivers = new List<Claimamt>(); // Option 1
public MyModel()
{
_drivers = new List<Claimant>(); // Option 2
}
public IEnumerable<Claimant> Drivers
{
get
{
return _drivers ?? (_drivers = new List<Claimant>()); // Option 3
}
set
{
_drivers = value;
}
}
private List _drivers=new List();//选择1
公共MyModel()
{
_驱动程序=新列表();//选项2
}
公共数字驱动程序
{
得到
{
返回_drivers???(_drivers=new List());//选项3
}
设置
{
_驱动因素=价值;
}
}
找出导致问题的确切属性名称和类型:
public class TestBinder: DefaultModelBinder
{
public override object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
Debug.WriteLine(bindingContext.ModelName);
Debug.WriteLine(bindingContext.ModelType.ToString());
//HOW TO USE: Look at your Output for the most recently output ModelName and Type to determine where there problem lies
return base.BindModel(controllerContext, bindingContext);
}
}
将此活页夹设置为默认活页夹:
ModelBinders.Binders.DefaultBinder = new TestBinder();
这纠正了错误,只是整个事情对我来说很奇怪。我想我必须深入研究默认绑定器源代码,看看它到底在这里做什么。属性返回的集合必须是动态的,而不是静态只读数组,因为模型绑定器试图调整它的大小。有一个类似的问题,我检查了方法是否是公共的和特殊的方法属性,尽管这很简单,比如将
Enumerable.Empty()
更改为newlist()
。干杯@DarinDimitrov!仅供参考,我在将数组默认为空数组(而不是null)时也遇到了这个问题。解决方案是将数组设置为null,或者创建一个新的模型绑定器,如图所示(尽管我还没有尝试这两种解决方案):
private List<Claimant> _drivers = new List<Claimamt>(); // Option 1
public MyModel()
{
_drivers = new List<Claimant>(); // Option 2
}
public IEnumerable<Claimant> Drivers
{
get
{
return _drivers ?? (_drivers = new List<Claimant>()); // Option 3
}
set
{
_drivers = value;
}
}
public class TestBinder: DefaultModelBinder
{
public override object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
Debug.WriteLine(bindingContext.ModelName);
Debug.WriteLine(bindingContext.ModelType.ToString());
//HOW TO USE: Look at your Output for the most recently output ModelName and Type to determine where there problem lies
return base.BindModel(controllerContext, bindingContext);
}
}
ModelBinders.Binders.DefaultBinder = new TestBinder();